Как перевести строковую дату в datetime в Python: от простого к сложному

Раздел: Основы Python -> Работа с датой и временем

Преобразование строки в дату в Python: обзор методов

Как стандартными средствами преобразовать строку известного формата?

Основной и наиболее надёжный способ – использование метода datetime.strptime() из модуля datetime. Этот метод принимает два аргумента: строку с датой и строку формата, описывающую, как эта дата записана. Метод возвращает объект datetime.


from datetime import datetime

date_string = "2023-10-15 14:30:00"
format_string = "%Y-%m-%d %H:%M:%S"
date_object = datetime.strptime(date_string, format_string)
print(date_object)
  

Python вывести время (вывод текущего времени в python)

2023-10-15 14:30:00
  

Python вывести год (вывод текущего года в python)

В примере используется строка формата %Y-%m-%d %H:%M:%S, где %Y – год из четырёх цифр, %m – месяц с ведущим нулём, %d – день, %H – часы (24-часовой формат), %M – минуты, %S – секунды.

Типичные ошибки:

  • Несоответствие формата строки и шаблона. Например, если в строке месяц указан как "Oct", а формат задан как %m (число), возникнет исключение ValueError.
  • Игнорирование локали. Для русских названий месяцев или дней недели нужно установить соответствующую локаль через locale.setlocale().
  • Пустая строка или некорректная дата (например, 31 февраля) также приводит к ValueError.

Как преобразовать строку, если формат заранее неизвестен?

В таких случаях удобно использовать библиотеку python-dateutil. Её функция parser.parse() способна распознавать большинство распространённых форматов дат и времени без явного указания шаблона.


from dateutil import parser

date_string = "15-10-2023 2:30 PM"
date_object = parser.parse(date_string)
print(date_object)
  

Python date day (компоненты даты)

2023-10-15 14:30:00
  

Python datetime date (модуль datetime)

dateutil анализирует строку и самостоятельно подбирает подходящий формат. Однако для уверенности в результате лучше проверять его на тестовых данных.

Проблемы и ограничения:

  • Неоднозначные даты, например "01/02/2023" – январь или февраль? По умолчанию parse считает первое число днём, второе – месяцем (или наоборот в зависимости от локали). Для избежания путаницы следует задавать параметр dayfirst=True или yearfirst=True.
  • Библиотека не входит в стандартную поставку Python, требуется установка (pip install python-dateutil).
  • Работа с часовыми поясами может потребовать дополнительных настроек.

Как преобразовать серию строк в даты при работе с данными (pandas)?

В экосистеме анализа данных часто используют библиотеку pandas. Метод pd.to_datetime() принимает строку, список строк или столбец DataFrame и автоматически определяет формат, возвращая объект Timestamp или DatetimeIndex.


import pandas as pd

dates = ["2023-10-15", "2023-10-16", "2023-10-17"]
datetime_objects = pd.to_datetime(dates)
print(datetime_objects)
  

Python string to date (преобразование строки в дату)

DatetimeIndex(['2023-10-15', '2023-10-16', '2023-10-17'], dtype='datetime64[ns]', freq=None)
  

Python тип время (тип время (datetime) в python)

Этот метод хорошо оптимизирован для работы с большими объёмами данных, а также поддерживает обработку ошибок (параметр errors).

Распространённые проблемы:

  • Если в данных встречаются строки, которые не удаётся преобразовать, можно задать errors='coerce' – тогда некорректные значения станут NaT (Not a Time).
  • Формат может быть неоднозначным; рекомендуется при возможности указывать параметры dayfirst, yearfirst или format для ускорения и точности.

Как преобразовать строку с учётом часового пояса?

Если строка содержит информацию о часовом поясе (например, "2023-10-15T14:30:00+03:00"), удобно использовать тот же dateutil или pandas. Стандартный strptime с этим не справится – он не поддерживает разбор смещений времени.


from dateutil import parser

date_string = "2023-10-15T14:30:00+03:00"
date_object = parser.parse(date_string)
print(date_object)
print(date_object.tzinfo)
  

Time data python (работа с временными данными (time) в python)

2023-10-15 14:30:00+03:00
+03:00
  

Полученный объект содержит информацию о часовом поясе. Для дальнейших операций удобно перевести его в UTC или другой пояс через метод astimezone().

Сложности:

  • Некоторые сокращения часовых поясов (например, "EST", "MSK") неоднозначны и могут быть проинтерпретированы неверно. Лучше использовать явное смещение UTC.
  • Работа с часовыми поясами требует установки дополнительных библиотек (pytz или zoneinfo).
- Python текущая дата и время (получение текущей даты и времени в python)

Расширенные примеры преобразования строки в дату

Пример

# Пример 1: Преобразование строки с русскими названиями месяцев
import locale
from datetime import datetime

locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')  # для Linux/Mac
# locale.setlocale(locale.LC_TIME, 'rus_rus')     # для Windows
date_string = "15 октября 2023"
date_object = datetime.strptime(date_string, "%d %B %Y")
print(date_object)
2023-10-15 00:00:00
Пример

# Пример 2: Обработка нескольких возможных форматов
from datetime import datetime

def parse_date(date_string):
    formats = ["%Y-%m-%d", "%d/%m/%Y", "%m/%d/%Y", "%d %b %Y"]
    for fmt in formats:
        try:
            return datetime.strptime(date_string, fmt)
        except ValueError:
            pass
    raise ValueError(f"Невозможно преобразовать строку: {date_string}")

print(parse_date("2023-10-15"))
print(parse_date("15/10/2023"))
print(parse_date("10/15/2023"))
print(parse_date("15 Oct 2023"))
2023-10-15 00:00:00
2023-10-15 00:00:00
2023-10-15 00:00:00
2023-10-15 00:00:00
Пример

# Пример 3: Преобразование Unix timestamp из строки
from datetime import datetime

timestamp_str = "1697388600"
timestamp = int(timestamp_str)
dt_object = datetime.utcfromtimestamp(timestamp)
print(dt_object)
2023-10-15 14:30:00
Пример

# Пример 4: Преобразование строки в дату с помощью встроенного модуля time
import time

date_string = "15.10.2023"
struct_time = time.strptime(date_string, "%d.%m.%Y")
print(struct_time)
# Преобразование struct_time в datetime
from datetime import datetime
dt_object = datetime(*struct_time[:6])
print(dt_object)
time.struct_time(tm_year=2023, tm_mon=10, tm_mday=15, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=288, tm_isdst=-1)
2023-10-15 00:00:00
Пример

# Пример 5: Использование параметра format в pandas для ускорения
import pandas as pd

dates = ["2023-10-15", "2023-10-16", "2023-10-17"]
# Явное указание формата повышает производительность и избегает неоднозначности
result = pd.to_datetime(dates, format="%Y-%m-%d")
print(result)
DatetimeIndex(['2023-10-15', '2023-10-16', '2023-10-17'], dtype='datetime64[ns]', freq=None)
Пример

# Пример 6: Комбинирование строки с разделением на части
from datetime import datetime

date_parts = "2023/10/15 14:30:00".split(" ")
date_str, time_str = date_parts
year, month, day = map(int, date_str.split("/"))
hour, minute, second = map(int, time_str.split(":"))
dt_object = datetime(year, month, day, hour, minute, second)
print(dt_object)
2023-10-15 14:30:00

Преобразование строки в дату - comments

En
Python string to date (python)