Подтвердить что ты не робот

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), как и ожидалось.

4b9b3361

Ответ 1

Укажите dayfirst=True:

>>> dateutil.parser.parse("05.01.2015", dayfirst=True)
datetime.datetime(2015, 1, 5, 0, 0)

Это дает преимущество в формате DD-MM-YYYY вместо MM-DD-YYYY в случаях, когда формат даты неоднозначен (например, когда день равен 12 или ниже). Эта функция документирована здесь.

Ответ 2

Вы спросили: "Как я могу сказать код, что формат dd.mm.yyyy?"

Так как вы уже импортировали dateutil, то чаще всего direct ответ может указывать формат строки даты, но это довольно уродливый код:

>>> 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]>

Хотя я считаю, что форматирование arrow легче запомнить, pendulum использует старую систему форматирования Python, которая может спасти вас, чтобы узнать стрелку.

>>> import pendulum
>>> pendulum.datetime.strptime(date_string, '%d.%m.%Y')
<Pendulum [2015-01-05T00:00:00+00:00]>