web-dev-qa-db-ja.com

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)として解析されます。

24
Timo002

dayfirst=Trueを指定します。

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

これは、日付形式があいまいな場合(日が12以下の場合など)、MM-DD-YYYYではなくDD-MM-YYYY形式を優先します。この機能は文書化されています here

40
Alex Riley

「フォーマットが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]>
3
Bill Bell