Під час роботи з необробленими даними дати часто подаються у вигляді рядкових об’єктів. Однак рядки не дають змоги безпосередньо звертатися до таких атрибутів, як рік, місяць чи день. Щоб мати доступ до цих властивостей, потрібно перетворити рядок на повноцінний об’єкт datetime, який Python розпізнає як дату.
Модулі Python datetime і time містять метод strptime(). За його допомогою можна розбирати рядки з датами та перетворювати їх на об’єкти типу datetime або struct_time. Після перетворення можна легко отримати окремі елементи дати або виконувати різні операції, пов’язані з датами.
У цьому посібнику ви дізнаєтесь, як ефективно перетворювати рядок на дату у Python за допомогою методу strptime(). Крім того, ми розглянемо, як перетворити рядок на об’єкт datetime у Python. Почнімо!
Коди форматів для DateTime у Python
Перш ніж перейти до перетворення рядків у дати, варто зрозуміти коди форматування, які використовує модуль datetime. Ці коди є «будівельними блоками» для розбору й форматування дат і часу. Нижче наведено найуживаніші коди, з якими ви стикатиметеся:
%Y: позначає рік у діапазоні від 0001 до 9999.
%m: позначає місяць року, значення від 01 до 12.
%d: позначає день місяця, значення від 01 до 31.
%H: позначає годину у 24-годинному форматі, значення від 00 до 23.
%I: позначає годину у 12-годинному форматі, значення від 01 до 12.
%M: позначає хвилини години, значення від 00 до 59.
%S: позначає секунди хвилини, значення від 00 до 59.
Повний список кодів форматування можна знайти у документації Python у розділі «strftime() and strptime() Format Codes».
Перетворення рядка на об’єкт datetime у Python за допомогою datetime.strptime()
Метод datetime.strptime() має таку синтаксичну форму:
datetime.strptime(date_string, format)
Цей метод перетворює рядок із датою на об’єкт datetime відповідно до вказаного формату. Обидва аргументи — date_string і format — є обов’язковими та мають передаватися у вигляді рядків.
Приклад: перетворення рядка на об’єкт datetime.datetime()
Нижче наведено приклад, який демонструє, як перетворити рядок із датою та часом на об’єкт datetime.datetime. Також виводиться тип і значення отриманого об’єкта:
from datetime import datetime
# Example date and time string
datetime_str = '12/25/23 08:30:00'
# Convert the string to a datetime object
datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S')
# Print the type and value of the datetime object
print(type(datetime_object))
print(datetime_object) # Output in the default format

Вихід:

Приклад: перетворення рядка на об’єкт datetime.date()
Нижче наведено приклад того, як перетворити рядок із датою на об’єкт datetime.date. Код виводить тип і значення отриманого об’єкта:
from datetime import datetime
# Example date string
date_str = '12-31-2023'
# Convert the string to a date object
date_object = datetime.strptime(date_str, '%m-%d-%Y').date()
# Print the type and value of the date object
print(type(date_object))
print(date_object) # Output in default format

Вихід:

Приклад: перетворення рядка на об’єкт datetime.time()
Цей приклад демонструє, як перетворити рядок із часом на об’єкт datetime.time. Тип і значення отриманого об’єкта виводяться на екран:
from datetime import datetime
# Example time string
time_str = '22::45::15'
# Convert the string to a time object
time_object = datetime.strptime(time_str, '%H::%M::%S').time()
# Print the type and value of the time object
print(type(time_object))
print(time_object)

Вихід:

Приклад: перетворення рядка на об’єкт datetime.time()
Цей приклад демонструє, як перетворити рядок із часом на об’єкт datetime.time. Тип і значення отриманого об’єкта виводяться на екран:
from datetime import datetime
import locale
# Set locale to French
locale.setlocale(locale.LC_ALL, 'fr_FR')
# Example French locale date string
date_str_fr_FR = '25-Décembre-2023 Lundi' # fr_FR locale
# Convert the string to a datetime object
datetime_object = datetime.strptime(date_str_fr_FR, '%d-%B-%Y %A')
# Print the type and value of the datetime object
print(type(datetime_object))
print(datetime_object)

Примітка: об’єкт datetime.datetime() не зберігає назву дня тижня (Lundi у цьому прикладі) з вихідного рядка. Натомість він зберігає день тижня внутрішньо як числове значення.
Перетворення рядка на об’єкт struct_time за допомогою time.strptime()
Метод time.strptime() використовується для розбору рядка та перетворення його на об’єкт time.struct_time. Його синтаксис такий:
time.strptime(time_string[, format])
Цей метод повертає об’єкт time.struct_time, який відповідає заданим параметрам time_string і format. Аргумент time_string є обов’язковим, і обидва аргументи мають передаватися у вигляді рядків. Якщо формат не вказано, метод використовує формат за замовчуванням:
Це той самий формат, який повертає функція ctime(). Директиви форматування, що використовуються в time.strptime(), узгоджуються з тими, що застосовуються в time.strftime(). Докладніше про це можна дізнатися в офіційній документації Python до модуля time.
Приклад: перетворення рядка на об’єкт struct_time() із користувацьким форматом
Нижче наведено приклад перетворення рядка з часом на об’єкт time.struct_time за допомогою власного формату:
import time
# Example time string
time_str = '10::45::30'
# Convert to a struct_time object using a custom format
time_obj = time.strptime(time_str, '%H::%M::%S')
print("A time.struct_time object using the provided format:")
print(time_obj)

Вихід:

Примітка: під час перетворення на об’єкт time.struct_time будь-які не вказані директиви формату заповнюються стандартними значеннями-заповнювачами.
Приклад: перетворення рядка на об’єкт struct_time() із використанням формату за замовчуванням
Якщо формат не задано, метод time.strptime() застосовує формат за замовчуванням ('%a %b %d %H:%M:%S %Y'). Якщо вхідний рядок не збігається з цим форматом точно, буде згенеровано помилку.
import time
# Example time string matching the default format
time_str_default = 'Tue Mar 14 12:15:45 2023'
# Convert to a struct_time object using the default format
time_obj_default = time.strptime(time_str_default)
print("A time.struct_time object using the default format:")
print(time_obj_default)

Примітка: як і в попередньому прикладі, під час перетворення рядка для будь-яких відсутніх директив формату використовуються стандартні значення-заповнювачі.
Як усунути помилки strptime()?
Під час використання методу strptime() виникає помилка ValueError, якщо вхідний рядок не відповідає очікуваному формату. Щоб коректно обробити такі помилки, можна застосувати блок try для перевірки розбору та блок except для перехоплення й виведення повідомлення про помилку. Повідомлення ValueError від strptime() чітко пояснюють причину збою розбору.
Нижче наведено приклад, який демонструє типові проблеми, як-от невідповідність формату або наявність зайвих даних:
from datetime import datetime
import time
# Example 1: Mismatched format for datetime
datetime_str = '05-25-2023 08:30:00'
try:
datetime_object = datetime.strptime(datetime_str, '%m/%d/%Y')
except ValueError as ve1:
print('Error 1:', ve1)
# Example 2: Invalid time string
time_str = '12:70:50'
try:
time_object = time.strptime(time_str, '%H:%M:%S')
except ValueError as ve2:
print('Error 2:', ve2)

Вихід:

Висновки
У цьому посібнику ви дізналися, як перетворювати рядки на об’єкти date та datetime у Python за допомогою методу strptime(). Ви навчилися працювати з різними форматами, розбирати дати, час і навіть рядки, що залежать від локалі. Крім того, ви ознайомилися з поширеними помилками, такими як невідповідність формату, і з тим, як ефективно їх усувати.
Опрацювання перетворень рядків у дати — це ключова навичка для роботи з часовими даними в Python. Розуміння кодів форматів і правильне узгодження рядків із очікуваними форматами дає змогу впевнено виконувати операції з датами та часом у ваших проєктах.
Дякуємо за увагу! Сподіваємося, цей посібник допоможе вам упевнено працювати з потужними бібліотеками Python для роботи з датами та часом.
Покращуйте свій хостинг разом із Host-World! Насолоджуйтесь надійними VPS-планами від $7.5/місяць або відкрийте повну потужність виділених серверів від $99/місяць — усе це з цілодобовою професійною підтримкою. Підніміть свою онлайн-присутність на новий рівень уже сьогодні!