Python dateutil.parser.parse先解析一个月,而不是一天

时间:2015-01-06 14:29:02

标签: python parsing datetime format python-dateutil

我使用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 个答案:

答案 0 :(得分:37)

指定dayfirst=True

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

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

答案 1 :(得分:2)

你问,'我怎么能告诉代码格式是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]>

虽然我发现arrow的格式更容易记住,pendulum使用Python的旧格式系统,这可能会让您不必学习箭头。

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