У меня есть дамп-файл CSV из резервной копии Blackberry IPD, созданный с использованием IPDDump. Строки даты / времени здесь выглядят примерно так (где EST
находится австралийский часовой пояс):
Tue Jun 22 07:46:22 EST 2010
Мне нужно иметь возможность разобрать эту дату в Python. Сначала я попытался использовать strptime()
функцию из datettime.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Однако по какой-то причине datetime
возвращаемый объект, похоже, не tzinfo
связан с ним.
Я прочитал на этой странице, что, по-видимому, datetime.strptime
молча отбрасывает tzinfo
, однако, я проверил документацию, и я не могу найти ничего подобного, документированного здесь .
Мне удалось разобрать дату, используя стороннюю библиотеку Python, dateutil , однако мне все еще интересно, как я strptime()
неправильно использовал встроенную библиотеку ? Можно ли как-нибудь strptime()
поиграть с часовыми поясами?
Ответы:
Документация к
datetime
модулю гласит:Видишь это
[0:6]
? Это получает вас(year, month, day, hour, minute, second)
. Ничего больше. Нет упоминания о часовых поясах.Интересно, что [Win XP SP2, Python 2.6, 2.7] передача вашего примера
time.strptime
не работает, но если вы удалите "% Z" и "EST", это сработает. Также работает «UTC» или «GMT» вместо «EST». «PST» и «MEZ» не работают. Непонятные.Стоит отметить, что это было обновлено с версии 3.2, и в той же документации теперь также говорится следующее:
Обратите внимание, что это не работает с% Z, поэтому важен случай. Смотрите следующий пример:
источник
Я рекомендую использовать python-dateutil . Его парсер смог проанализировать все форматы дат, которые я выбрасывал.
и так далее. Не занимайтесь
strptime()
ерундой формата ... просто добавьте дату, и она все сделает правильно.Обновление : Ой. Я пропустил в вашем первоначальном вопросе, который вы упомянули, который вы использовали
dateutil
, извините за это. Но я надеюсь, что этот ответ все еще полезен для других людей, которые сталкиваются с этим вопросом, когда у них есть вопросы разбора даты и видят полезность этого модуля.источник
>>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
parser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
dateutil.parser.parse("10-27-2016 09:06 AM PDT")
возвращается:datetime.datetime(2016, 10, 27, 9, 6)
не в состоянии определить часовой пояс ...dateutil parser
может быть простым в использовании, ноstrptime()
быстрее. Кроме того, его форматы довольно просты в освоении.Ваша строка времени аналогична формату времени в rfc 2822 (формат даты в электронной почте, заголовки http) . Вы можете разобрать его, используя только stdlib:
Ознакомьтесь с решениями, которые предоставляют объекты datetime с учетом часового пояса для различных версий Python: анализ даты и часового пояса из электронного письма .
В этом формате
EST
семантически эквивалентен-0500
. Хотя, в общем, сокращения часового пояса недостаточно, чтобы однозначно идентифицировать часовой пояс .источник
Столкнулся с этой точной проблемой.
Что я в итоге сделал:
источник