关于解析:Python dateutil.parser.parse首先解析月份,而不解析日期

Python dateutil.parser.parse parses month first, not day

我正在使用dateutil.parser.parse从字符串格式化日期。 但是现在它混合了月份和日期。

我有一个包含05.01.2015的字符串。 后

1
dateutil.parser.parse("05.01.2015")

它返回:

1
datetime.datetime(2015, 5, 1, 0, 0)

我希望它会返回(2015, 1, 5, 0, 0)

如何告诉代码格式为dd.mm.yyyy

为了记录,25.01.2015将按预期解析为(2015, 1, 25, 0, 0)


指定dayfirst=True

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

在日期格式不明确的情况下(例如,当日期为12或更低时),这优先于DD-MM-YYYY格式而不是MM-DD-YYYY。 该功能在此处记录。


您问:"我如何告诉代码格式为dd.mm.yyyy?"

因为您已经导入了dateutil,所以最直接的答案可能是指定日期字符串的格式,但这是非常丑陋的代码:

1
2
>>> dateutil.parser.datetime.datetime.strptime(date_string, '%d.%m.%Y')
datetime.datetime(2015, 1, 5, 0, 0)

我们可以看到代码中嵌入了一个明显的替代方案。 您可以直接使用它。

1
2
3
>>> from datetime import datetime
>>> datetime.strptime(date_string, '%d.%m.%Y')
datetime.datetime(2015, 1, 5, 0, 0)

也有一些较新的替代库提供大量的方法和属性。

在这种情况下最简单使用的是arrow

1
2
3
>>> import arrow
>>> arrow.get(date_string, 'DD.MM.YYYY')
<Arrow [2015-01-05T00:00:00+00:00]>

尽管我发现箭头的格式更容易记住,但摆锤使用Python的旧格式系统,这可能使您不必学习箭头的格式。

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