Шаг 59.
Python: сборник рецептов.
Числа, даты и время. Конвертирование строк в даты и время

    На этом шаге мы рассмотрим способы решения этой задачи.

Задача

    Ваше приложение получает данные о времени в строковом формате, но вы хотите конвертировать их в объекты datetime, чтобы выполнять над ними нестроковые операции.

Решение

    Стандартный модуль datetime обычно легко справляется с этой задачей. Например:

>>> from datetime import datetime 
>>> text = '2012-09-20'
>>> y = datetime.strptime(text, '%Y-%m-%d')
>>> z = datetime.now()
>>> diff = z - y 
>>> diff
datetime.timedelta(days=4943, seconds=44129, microseconds=205062)
>>>


Обсуждение

    Метод datetime.strptime() поддерживает множество параметров форматирования, таких как %Y для года из четырех цифр и %m для месяца из двух цифр. Также стоит отметить, что эти параметры-заглушки работают в обратном направлении, что поможет, если вам нужно вывести объект datetime в строке и при этом заставить его красиво выглядеть.

    Предположим, что ваша программа генерирует объект datetime, но вам нужно создать из него красивую, понятную людям дату, чтобы потом вставить ее в заголовок автоматически создаваемого письма или отчета:

>>> z
datetime.datetime(2026, 4, 3, 12, 15, 29, 205062)
>>> nice_z = datetime.strftime(z, '%A %B %d, %Y')
>>> nice_z
'Friday April 03, 2026'
>>> 

    Стоит отметить, что производительность метода strptime() часто оказывается намного хуже, чем вы могли бы ожидать, поскольку функция написана на чистом Python и должна работать со всеми установками системной локализации. Если вы парсите множество дат в своей программе и знаете их точный формат, то можете добиться намного более высокой производительности путем написания собственного решения. Например, если вы знаете, что даты представлены в формате "YYYY-MM-DD", то можете написать такую функцию:

>>> from datetime import datetime
>>> def parse_ymd(s):
	year_s, mon_s, day_s = s.split('-')
	return datetime(int(year_s), int(mon_s), int(day_s))

>>> 

    При тестировании эта функции оказалась более чем в 7 раз быстрее метода datetime.strptime(). Это стоит держать в голове, если вы обрабатываете большие объемы данных с датами.

    На следующем шаге мы рассмотрим манипулирование датами с учетом временных зон.




Предыдущий шаг Содержание Следующий шаг