【问题标题】:Python dateutil.parser.parse parses month first, not dayPython dateutil.parser.parse 首先解析月份,而不是日期
【发布时间】:2015-01-06 14:29:02
【问题描述】:

我使用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),正如预期的那样。

【问题讨论】:

    标签: python parsing datetime format python-dateutil


    【解决方案1】:

    指定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。

    【讨论】:

    • Tnx,这成功了!我一直在查看您所指的文档,但找不到任何东西。但现在它工作正常! (我在 2014 年 12 月 12 日之后创建了这段代码,所以一切都很顺利。)
    • 没问题 - 很高兴它有帮助。
    • 作为警告,请注意,即使使用dayfirst=True,如果您传递“格式错误”的日期,例如01.13.2015,parse 将忽略dayfirst 并解释month=1 和day=13 ,这可能会导致意外行为。
    • 我处理这个问题的方式是我运行 dayfirst 和 yearfirst 的所有 4 个组合,并将结果粘贴到一个集合中,如果集合最后包含多个内容,我会提出“模棱两可值”错误
    【解决方案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]>
    

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多