Як перетворити рядок на дату і час у Python

Конвертація даних з одного типу в інший є надзвичайно важливою операцією в будь-якій мові програмування. Практично всі мови програмування забезпечують механізми для перетворення між вбудованими типами даних.

Проте, спеціалізовані типи даних, такі як дата і час (datetime), часто вимагають використання додаткових модулів для їх обробки. Це особливо актуально для операцій з датою та часом, оскільки їх обробка може бути складною задачею для програмістів. На щастя, Python надає вбудовані модулі для зручної роботи з даними типу datetime.

У цій статті ми розглянемо, як можна перетворити рядок, що представляє дату та час, в об’єкт datetime у Python, використовуючи різні модулі. Спочатку давайте розберемося, чому така конвертація є необхідною.

Навіщо перетворювати рядок дати й часу на об’єкт datetime?

Робота з датами, коли вони представлені у вигляді звичайних рядків, може бути досить складною. Перетворення таких рядків в об’єкти типу datetime значно спрощує маніпулювання ними. Рядки, які представляють дати, є аналогічними до звичайних рядків і не мають спеціалізованих методів для операцій з датами. Натомість вони мають загальні методи рядків, які не є корисними при роботі з датами.

Розглянемо ситуацію, коли потрібно порівняти дві дати. Якщо вони представлені у вигляді рядків, їх буде важко коректно порівняти. Однак, якщо ці дати є об’єктами типу datetime, ми можемо використовувати стандартні оператори порівняння, так само як і з числами.

Це лише один із прикладів, що ілюструє, наскільки перетворення до формату datetime полегшує роботу. Існує безліч сценаріїв, таких як додавання дат, віднімання, обробка часових поясів тощо, де конвертація рядка дати й часу в об’єкт datetime значно спрощує процес.

Враховуючи це, давайте розглянемо різні підходи до перетворення рядка дати й часу в об’єкт datetime. Ми використовуватимемо вбудований модуль `datetime` та сторонній модуль `dateutil`. Розпочнемо з модуля `datetime`.

Застосування модуля datetime

Модуль `datetime` є вбудованим модулем Python, призначеним для роботи з датами та часом. Він містить багато класів, які полегшують маніпуляції з даними такого типу. Для нашої задачі перетворення ми скористаємося класом `datetime.datetime`.

Клас `datetime.datetime` має багато методів, серед яких нас особливо цікавить метод `strptime`, який використовується для конвертації рядка в об’єкт datetime. Давайте поглянемо на нього детальніше.

datetime.strptime

Метод `datetime.strptime` призначений для перетворення рядка, що представляє дату та час, в об’єкт datetime. Він приймає два рядки як аргументи: перший – це рядок з датою та часом, а другий – формат цього рядка. Метод повертає об’єкт datetime.

Розглянемо приклад використання:

from datetime import datetime

string = "19-12-2022 09:37:56 PM"
formatting = "%d-%m-%Y %I:%M:%S %p"
print(datetime.strptime(string, formatting))

Виконавши цей код, ви отримаєте наступний результат:

2022-12-19 21:37:56

Ми використали метод `datetime.strptime` для перетворення рядка дати й часу в об’єкт datetime. Важливо пам’ятати, що формат, який передається методу, має точно відповідати формату вхідного рядка. У випадку невідповідності виникне помилка або результат буде некоректним.

Ми використали деякі коди форматування, щоб задати формат дати й часу. Переглянути всі можливі коди форматування можна в документації Python.

Метод `datetime.strptime` повертає повну дату та час. Якщо необхідно отримати дату та час окремо, можна скористатися методами `date()` та `time()` об’єкта datetime. Розглянемо приклад:

from datetime import datetime

string = "19-12-2022 09:37:56 PM"
formatting = "%d-%m-%Y %I:%M:%S %p"

## Отримання дати окремо
print("Date:", datetime.strptime(string, formatting).date())

## Отримання часу окремо
print("Time:", datetime.strptime(string, formatting).time())

Запустивши цей код, ви отримаєте наступні результати:

Date: 2022-12-19
Time: 21:37:56

Методи `date()` та `time()` повертають відповідні об’єкти дати та часу, які мають свої власні методи для подальшої обробки.

Як бачимо з попередніх прикладів, метод `datetime.strptime` вимагає точної відповідності формату вхідного рядка. Якщо ми допустимо помилку у форматі, виникне помилка. Розглянемо приклад:

from datetime import datetime

string = "19:12:2022 09:37:56 PM"
formatting = "%d-%m-%Y %I:%M:%S %p"
print(datetime.strptime(string, formatting))

Цей код спричинить помилку, оскільки формат не відповідає рядку дати та часу. Щоб уникнути таких помилок, можна використовувати блоки `try-except`:

from datetime import datetime

try:
    string = "19:12:2022 09:37:56 PM"
    formatting = "%d-%m-%Y %I:%M:%S %p"
    print(datetime.strptime(string, formatting))
except ValueError as error:
    print(error)

Запустивши код знову, ви побачите повідомлення про помилку, але програма не зупиниться.

time data '19:12:2022 09:37:56 PM' does not match format '%d-%m-%Y %I:%M:%S %p'

Аналогічно, ми можемо використовувати `try-except` і для методу `parser.parse`, який розглянемо далі. Це допоможе нам уникнути раптової зупинки програми. Хоча це і не є основною темою цієї статті, важливо пам’ятати про використання обробки винятків у вашому коді.

Це все про модуль `datetime`. Перейдемо до наступного модуля – `dateutil`.

Використання модуля dateutil

Модуль `dateutil` надає розширення до модуля `datetime`. Він значно полегшує роботу з датами та часом завдяки своїм простим та зручним методам. Спочатку встановимо модуль за допомогою наступної команди:

pip install python-dateutil

Нас цікавить метод `dateutil.parser.parse`. Давайте подивимося, як він перетворює рядок дати й часу в об’єкт datetime.

parser.parse

Метод `parser.parse` приймає рядок, що представляє дату та час, і перетворює його у відповідний об’єкт datetime. Для цього методу не потрібно явно вказувати формат рядка. Він автоматично визначає формат і виконує перетворення. Розглянемо приклад:

from dateutil import parser

string = "19-12-2022 09:37:56 PM"
print(parser.parse(string))

Виконавши цей код, ви отримаєте наступний результат:

2022-12-19 21:37:56

Рядок дати й часу повинен бути в одному з форматів, які підтримує метод `parser.parse`. У випадку невідповідності формату виникне помилка. Перелік усіх підтримуваних форматів можна знайти в документації.

Оскільки метод `parser.parse` повертає об’єкт datetime, ми можемо отримати доступ до окремих компонентів дати та часу, як і з модулем `datetime`. Розглянемо приклад:

from dateutil import parser

string = "19-12-2022 09:37:56 PM"
print("Date:", parser.parse(string).date())
print("Time:", parser.parse(string).time())

Запустивши цей код, ви отримаєте наступні результати:

Date: 2022-12-19
Time: 21:37:56

Як бачите, `dateutil` спрощує роботу з датами та часом. Ви можете знайти більше інформації про цей модуль в його документації.

Висновок

У цій статті ми розглянули два способи перетворення рядка, що представляє дату й час, в об’єкт datetime: використовуючи вбудований модуль `datetime` та сторонній модуль `dateutil`. Також існує ще один вбудований модуль під назвою `time`, за допомогою якого можна досягти аналогічного результату. Рекомендую вам спробувати його самостійно, оскільки ви вже знайомі з процесом перетворення з інших модулів.

Можливо, існують і інші бібліотеки, за допомогою яких можна виконати подібне перетворення. Проте, модулі, які ми розглянули в цій статті, є стандартними та широко використовуються. Ви можете дослідити інші модулі і обрати той, який найбільше підходить для ваших потреб.

Ви також можете вивчити, як обчислювати різницю між датами та часом у Python.

Бажаю вам успішного кодування! 🙂