Преобразование строки в объект даты и времени

Я пытался преобразовать строку в объект datetime. Строка, которую я получил из новостной ленты, имеет следующий формат: "Чт, 16 октября 2014 01:16:17 ПО ВОСТОЧНОМУ ВРЕМЕНИ"

Я пытался использовать datetime.strptime(), чтобы преобразовать его. т.е.

datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')

И получил следующую ошибку:

Traceback (последний вызов был последним):
Файл "", строка 1, в datetime.strptime (Чт, 16 октября 2014, 01:16:17 ПО ВОСТОЧНОМУ ВРЕМЕНИ,'%a, %d %b %Y %H:%M:%S %Z')
Файл "C:\Anaconda\lib_strptime.py", строка 325, в _strptime (строка данных, формат))
Ошибка ValueEr: данные времени 'Четверг, 16 октября 2014 г. 01:16:17 ПО ВОСТОЧНОМУ ВРЕМЕНИ' не соответствуют формату '% a,% d% b% Y% H:% M:% S% Z'

Однако, если я попробовал строку без "EDT", это сработало. т.е.

datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')

Кто-нибудь знает, как разобрать эту часть "EDT"?

2 ответа

Решение

Для разбора даты в формате RFC 2822 вы можете использовать email пакет:

from datetime import datetime, timedelta
from email.utils import parsedate_tz, mktime_tz

timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)

Замечания: parsedate_tz() предполагает, что EDT соответствует -0400 Смещение UTC, но оно может быть неправильным в Австралии, где EDT +1100 (AEDT используется pytz в данном случае), т. е. сокращение часового пояса может быть неоднозначным. См. Разбор строки даты / времени с сокращенным названием часового пояса в Python?

Связанная ошибка Python: % Z в strptime не соответствует EST и другим.

Если ваш компьютер использует временные метки POSIX (вероятно), и вы уверены, что дата ввода находится в допустимом диапазоне для вашей системы (не слишком далеко в будущее / прошлое), и вам не нужно сохранять точность микросекунды, тогда вы могли бы использование datetime.utcfromtimestamp:

from datetime import datetime
from email.utils import parsedate_tz, mktime_tz

timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)

Решение email.utils.parsedate_tz() подходит для трехбуквенных часовых поясов, но не работает для четырех букв, таких как AEDT или CEST. Если вам нужно сочетание, ответ в разделе « Строка даты / времени синтаксического анализа с сокращенным именем часового пояса в Python»?работает для обоих с наиболее часто используемыми часовыми поясами.

Другие вопросы по тегам