Метод datetime. strptime()
Метод strptime() (string parse time) класса datetime принимает два основных аргумента:
Строка с датой/временем: Строка, которую вы хотите преобразовать. Формат строки: Строка, которая указывает strptime(), как интерпретировать входную строку. Это набор Кодов форматирования, которые соответствуют различным частям даты и времени.
Основные коды форматирования:
- %Y: Год с веком (например, 2023) %m: Месяц как десятичное число (01-12) %d: День месяца как десятичное число (01-31) %H: Час (24-часовой формат) как десятичное число (00-23) %M: Минута как десятичное число (00-59) %S: Секунда как десятичное число (00-59) %f: Микросекунда как десятичное число (000000-999999) %A: Полное название дня недели (например, ‘Monday’) %a: Сокращенное название дня недели (например, ‘Mon’) %B: Полное название месяца (например, ‘January’) %b: Сокращенное название месяца (например, ‘Jan’) %I: Час (12-часовой формат) как десятичное число (01-12) %p: Эквивалент ‘AM’ или ‘PM’ %c: Соответствующее представление даты и времени по умолчанию для локали %x: Соответствующее представление даты по умолчанию для локали %X: Соответствующее представление времени по умолчанию для локали %%: Символ ‘%’
Примеры преобразования строки в дату/время:
Python
From datetime import datetime
# Пример 1: Только дата (YYYY-MM-DD)
Date_string1 = "2023-10-26"
Date_object1 = datetime. strptime(date_string1, "%Y-%m-%d")
Print(f"Строка '{date_string1}' преобразована в: {date_object1}, Тип: {type(date_object1)}")
# Вывод: Строка '2023-10-26' преобразована в: 2023-10-26 00:00:00, Тип: <class 'datetime. datetime'>
# Пример 2: Дата и время (DD/MM/YYYY HH:MM:SS)
Date_string2 = "25/12/2024 14:30:00"
Date_object2 = datetime. strptime(date_string2, "%d/%m/%Y %H:%M:%S")
Print(f"Строка '{date_string2}' преобразована в: {date_object2}, Тип: {type(date_object2)}")
# Вывод: Строка '25/12/2024 14:30:00' преобразована в: 2024-12-25 14:30:00, Тип: <class 'datetime. datetime'>
# Пример 3: Месяц по названию, 12-часовой формат с AM/PM
Date_string3 = "Jan 15, 2023 09:00 AM"
Date_object3 = datetime. strptime(date_string3, "%b %d, %Y %I:%M %p")
Print(f"Строка '{date_string3}' преобразована в: {date_object3}, Тип: {type(date_object3)}")
# Вывод: Строка 'Jan 15, 2023 09:00 AM' преобразована в: 2023-01-15 09:00:00, Тип: <class 'datetime. datetime'>
# Пример 4: С микросекундами
Date_string4 = "2023-11-01 10:05:30.123456"
Date_object4 = datetime. strptime(date_string4, "%Y-%m-%d %H:%M:%S.%f")
Print(f"Строка '{date_string4}' преобразована в: {date_object4}, Тип: {type(date_object4)}")
# Вывод: Строка '2023-11-01 10:05:30.123456' преобразована в: 2023-11-01 10:05:30.123456, Тип: <class 'datetime. datetime'>
# Пример 5: Только время
Time_string = "18:45:15"
Time_object = datetime. strptime(time_string, "%H:%M:%S").time() # .time() чтобы получить только объект time
Print(f"Строка '{time_string}' преобразована в: {time_object}, Тип: {type(time_object)}")
# Вывод: Строка '18:45:15' преобразована в: 18:45:15, Тип: <class 'datetime. time'>
Обработка ошибок (ValueError)
Если формат входной строки не соответствует указанному формату, strptime() вызовет ошибку ValueError. Важно обрабатывать такие ситуации, особенно при работе с пользовательским вводом или внешними данными.
Python
From datetime import datetime
Wrong_format_string = "26-10-2023" # Ожидаем YYYY-MM-DD, а получили DD-MM-YYYY
Try:
date_object = datetime. strptime(wrong_format_string, "%Y-%m-%d")
print(f"Успешно преобразовано: {date_object}")
Except ValueError as e:
print(f"Ошибка преобразования: {e}")
print("Убедитесь, что формат строки соответствует ожидаемому.")
# Вывод: Ошибка преобразования: time data '26-10-2023' does not match format '%Y-%m-%d'
# Вывод: Убедитесь, что формат строки соответствует ожидаемому.
Работа с датами без указания времени
Если ваша строка содержит только дату, strptime() по умолчанию заполнит время нулями (00:00:00). Если вам нужен только объект date, вы можете вызвать метод. date() у полученного объекта datetime.
Python
From datetime import datetime
Date_only_string = "2023-01-01"
Datetime_obj = datetime. strptime(date_only_string, "%Y-%m-%d")
Date_obj = datetime_obj. date()
Print(f"Объект datetime: {datetime_obj}, Тип: {type(datetime_obj)}")
Print(f"Объект date: {date_obj}, Тип: {type(date_obj)}")
Заметка о pandas и dateutil
Для более сложных сценариев, например, когда формат даты может быть не строго фиксированным, или при работе с большими объемами данных (например, из CSV-файлов), стоит рассмотреть использование библиотек:
- Pandas: Для работы с табличными данными pandas имеет очень мощную функцию pd. to_datetime(), которая может автоматически определять форматы и более эффективно обрабатывать ошибки. Dateutil: Предоставляет более гибкий парсер, который может угадывать формат даты/времени из строки (но это медленнее и менее надежно, чем явное указание формата).
Но для большинства случаев, где формат известен и предсказуем, встроенный datetime. strptime() является отличным и эффективным решением. В Python для преобразования строки в объект даты и/или времени (тип datetime) используется метод Strptime() из модуля datetime.
Суть метода strptime() заключается в том, что вы должны точно указать Формат, в котором дата и время представлены в вашей строке. Это делается с помощью специальных Кодов форматирования.
Основные шаги:
Импортировать класс datetime из модуля datetime. Определить строку с датой/временем. Создать строку формата, используя коды форматирования, которые точно соответствуют структуре вашей строки. Вызвать datetime. strptime(ваша_строка, строка_формата).
Коды форматирования:
Вот некоторые из наиболее часто используемых кодов форматирования:
- %Y: Год с веком (например, 2023) %m: Месяц в виде двузначного числа (01-12) %d: День месяца в виде двузначного числа (01-31) %H: Час (24-часовой формат) (00-23) %M: Минуты (00-59) %S: Секунды (00-59) %f: Микросекунды (000000-999999) %I: Час (12-часовой формат) (01-12) %p: AM или PM (используется с %I) %b: Сокращенное название месяца (например, Jan, Feb) %B: Полное название месяца (например, January, February) %a: Сокращенное название дня недели (например, Mon, Tue) %A: Полное название дня недели (например, Monday, Tuesday) %j: День года (001-366) %w: День недели как десятичное число, где воскресенье — 0, суббота — 6. %z: Смещение UTC в формате +HHMM или — HHMM (например, +0200 для CEST). %Z: Название часового пояса (например, CET, CEST).
Примеры:
Пример 1: Простой формат даты (YYYY-MM-DD)
Python
From datetime import datetime
Date_str = "2023-10-26"
Date_format = "%Y-%m-%d"
Try:
date_obj = datetime. strptime(date_str, date_format)
print(f"Преобразованная дата: {date_obj}")
print(f"Тип объекта: {type(date_obj)}")
Except ValueError as e:
print(f"Ошибка при преобразовании: {e}")
# Вывод:
# Преобразованная дата: 2023-10-26 00:00:00
# Тип объекта: <class 'datetime. datetime'>
Пример 2: Дата и время (YYYY-MM-DD HH:MM:SS)
Python
From datetime import datetime
Datetime_str = "2023-10-26 14:35:00"
Datetime_format = "%Y-%m-%d %H:%M:%S"
Try:
datetime_obj = datetime. strptime(datetime_str, datetime_format)
print(f"Преобразованные дата и время: {datetime_obj}")
Except ValueError as e:
print(f"Ошибка при преобразовании: {e}")
# Вывод:
# Преобразованные дата и время: 2023-10-26 14:35:00
Пример 3: Различные форматы даты
Python
From datetime import datetime
# Месяц/День/Год (MM/DD/YYYY)
Date_str_1 = "10/26/2023"
Date_format_1 = "%m/%d/%Y"
Date_obj_1 = datetime. strptime(date_str_1, date_format_1)
Print(f"Формат MM/DD/YYYY: {date_obj_1}")
# День-Месяц-Год (DD-MM-YYYY)
Date_str_2 = "26-10-2023"
Date_format_2 = "%d-%m-%Y"
Date_obj_2 = datetime. strptime(date_str_2, date_format_2)
Print(f"Формат DD-MM-YYYY: {date_obj_2}")
# Полное название месяца, День, Год
Date_str_3 = "October 26, 2023"
Date_format_3 = "%B %d, %Y"
Date_obj_3 = datetime. strptime(date_str_3, date_format_3)
Print(f"Полное название месяца: {date_obj_3}")
Пример 4: Время с AM/PM
Python
From datetime import datetime
Time_str = "02:30 PM"
Time_format = "%I:%M %p" # %I для 12-часового формата, %p для AM/PM
Time_obj = datetime. strptime(time_str, time_format).time() # .time() чтобы получить только объект time
Print(f"Преобразованное время (AM/PM): {time_obj}")
Datetime_str_ampm = "2023-10-26 09:15 AM"
Datetime_format_ampm = "%Y-%m-%d %I:%M %p"
Datetime_obj_ampm = datetime. strptime(datetime_str_ampm, datetime_format_ampm)
Print(f"Дата и время (AM/PM): {datetime_obj_ampm}")
Пример 5: Обработка ошибок
Если строка не соответствует указанному формату, strptime() вызовет исключение ValueError. Важно обрабатывать это, чтобы ваша программа не падала.
Python
From datetime import datetime
Wrong_date_str = "26/10/2023" # Ожидается YYYY-MM-DD
Expected_format = "%Y-%m-%d"
Try:
date_obj = datetime. strptime(wrong_date_str, expected_format)
print(f"Преобразованная дата: {date_obj}")
Except ValueError as e:
print(f"Ошибка: Неверный формат даты. Ожидался '{expected_format}', получено '{wrong_date_str}'.")
print(f"Детали ошибки: {e}")
# Вывод:
# Ошибка: Неверный формат даты. Ожидался '%Y-%m-%d', получено '26/10/2023'.
# Детали ошибки: time data '26/10/2023' does not match format '%Y-%m-%d'
Модуль dateutil. parser (для более гибкого парсинга)
Если вы не знаете точный формат входящих строк или форматы могут быть разнообразными, стандартный strptime() может быть неудобен. В таких случаях можно использовать стороннюю библиотеку Dateutil, которая имеет очень мощный парсер.
1. Установка Dateutil:
Bash
Pip install python-dateutil
2. Пример использования Dateutil. parser. parse():
Python
From dateutil import parser
Date_str_1 = "2023-10-26"
Date_str_2 = "26/10/2023 14:30"
Date_str_3 = "October 26, 2023 2:30 PM"
Date_str_4 = "Yesterday" # Также может парсить относительные даты
Print(f"Строка 1: {parser. parse(date_str_1)}")
Print(f"Строка 2: {parser. parse(date_str_2)}")
Print(f"Строка 3: {parser. parse(date_str_3)}")
Print(f"Строка 4: {parser. parse(date_str_4)}") # Парсит относительно текущей даты
# Вывод (может отличаться для "Yesterday" в зависимости от текущей даты):
# Строка 1: 2023-10-26 00:00:00
# Строка 2: 2023-10-26 14:30:00
# Строка 3: 2023-10-26 14:30:00
# Строка 4: 2025-05-22 00:00:00 (если сегодня 23 мая 2025)
Dateutil. parser. parse() очень удобен, но он может быть медленнее, чем strptime(), если вы обрабатываете очень большое количество дат, и вы всегда знаете точный формат. Для большинства задач dateutil является отличным выбором.