Python dateutil.parser.parse разбирает месяц, а не день
Я использую dateutil.parser.parse
отформатировать дату из строки. Но теперь он смешивает месяц и день.
У меня есть строка, которая содержит 05.01.2015
, После
dateutil.parser.parse("05.01.2015")
это возвращает:
datetime.datetime(2015, 5, 1, 0, 0)
Я надеялся, что это вернется (2015, 1, 5, 0, 0)
Как я могу сказать коду, что формат dd.mm.yyyy
?
Для записи, 25.01.2015
будет проанализирован как (2015, 1, 25, 0, 0)
, как и ожидалось.
2 ответа
Уточнить dayfirst=True
:
>>> dateutil.parser.parse("05.01.2015", dayfirst=True)
datetime.datetime(2015, 1, 5, 0, 0)
Это дает приоритет формату ДД-ММ-ГГГГ, а не ММ-ДД-ГГГГ в тех случаях, когда формат даты неоднозначен (например, когда день равен 12 или ниже). Функция задокументирована здесь.
Вы спросили: "Как я могу сказать коду, что формат dd.mm.yyyy?"
Так как вы уже импортировали dateutil
тогда наиболее прямым ответом может быть указание формата строки даты, но это довольно уродливый код:
>>> dateutil.parser.datetime.datetime.strptime(date_string, '%d.%m.%Y')
datetime.datetime(2015, 1, 5, 0, 0)
Мы видим очевидную альтернативу, встроенную в код. Вы можете использовать это напрямую.
>>> from datetime import datetime
>>> datetime.strptime(date_string, '%d.%m.%Y')
datetime.datetime(2015, 1, 5, 0, 0)
Есть также несколько новых альтернативных библиотек, которые предлагают множество методов и свойств.
Самый простой в использовании в этом случае будет arrow
:
>>> import arrow
>>> arrow.get(date_string, 'DD.MM.YYYY')
<Arrow [2015-01-05T00:00:00+00:00]>
Хотя форматирование для стрелки легче запомнить, маятник использует старую систему форматирования Python, которая может избавить вас от необходимости изучать стрелки.
>>> import pendulum
>>> pendulum.datetime.strptime(date_string, '%d.%m.%Y')
<Pendulum [2015-01-05T00:00:00+00:00]>