Преобразование строки в объект даты и времени
Я пытался преобразовать строку в объект 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»?работает для обоих с наиболее часто используемыми часовыми поясами.