【问题标题】:How to specify dateparser parsing to treat dd/mm/yyyy as default rather than mm/dd/yyyy如何指定 dateparser 解析以将 dd/mm/yyyy 视为默认而不是 mm/dd/yyyy
【发布时间】:2016-06-09 12:36:46
【问题描述】:

dateparser 包是一个很棒的包:https://dateparser.readthedocs.io/en/latest/

笼统地说:我需要能够以“印度”日期格式解析日期。

我使用的是 python 2.7 版本

准确地说:我得到了 -

>>> import dateparser
>>> dateparser.parse('Tue, 06/07/2016')
datetime.datetime(2016, 6, 7, 0, 0)

我需要

>>> import dateparser
>>> dateparser.parse('Tue, 06/07/2016')
datetime.datetime(2016, 7, 6, 0, 0)

如果您知道任何可以做到这一点的配置更改,那就太好了。 任何帮助将不胜感激。 :)

【问题讨论】:

  • dateparser 会自动为我执行此操作。编辑问题以使其更具可读性
  • 使用settings={'DATE_ORDER': 'DMY'}关键字参数到parse(参考我的回答)

标签: python python-2.7 date datetime


【解决方案1】:

dateparsersettings 来处理这样的场景。除了指定 date_formats,您还可以使用 DATE_ORDER 设置,如下所示。

In [3]: parse('Tue, 06/07/2016', settings={'DATE_ORDER': 'DMY'}) Out[3]: datetime.datetime(2016, 7, 6, 0, 0)

在这里寻找more settings

【讨论】:

    【解决方案2】:

    如果有人仍然面临这个问题,您可以查看Settings 文档 dateparser.readthedocs.io/en/latest/settings.html

    正如user739721 所指出的,您可以并且应该使用settings={'DATE_ORDER': 'DMY'} 作为parse 的关键字参数。 如果您多次调用dateparser.parse() 并且到处添加它会很痛苦,这可能会变得很麻烦。 为此,可以使用python自己的functools中的partial

    import functools
    import dateparser
    parse = functools.partial(dateparser.parse, settings={'DATE_ORDER': 'DMY'})
    

    现在任何对 parse 的调用都将使用“DMY”设置。

    警告:如果最终将设置传递给解析调用,则较早的设置将被覆盖。所以,有了上面的解析定义,

    In [21]: parse('1 3 1970').strftime("%B")
    Out[21]: 'March'
    
    In [22]: parse('1 3 1970', settings={}).strftime("%B")
    Out[22]: 'January'
    

    【讨论】:

      【解决方案3】:

      您可以使用 datetime.strptime 而不是 dateparser,因为它是 python 标准库的一部分:

      In [13]:
      import datetime as dt
      dt.datetime.strptime('Tue, 06/07/2016', '%a, %d/%m/%Y')
      
      Out[13]:
      datetime.datetime(2016, 7, 6, 0, 0)
      

      好的,看起来逗号让dateparser 感到不安,如果你没有在formats arg 中传递它,那么它会起作用:

      In [30]:    
      import dateparser
      dateparser.parse('Tue, 06/07/2016', date_formats=['%A %d/%m/%Y'])
      
      Out[30]:
      datetime.datetime(2016, 7, 6, 0, 0)
      

      【讨论】:

      • 感谢@EdChum,但我真的很想使用 dateparser,因为我可以获取任何格式的日期。我的程序的可能输入是:“2015 年 6 月 6 日”、“16/06/2015”、“16\n/06/2015”等。 dateparser 有助于无缝解码这些。但我只需要在可能的情况下将 mm/dd/yyyy 视为 dd/mm/yyyy。
      • 嗯,这只适用于一个正则表达式。如果我提供 dateparser.parse('06/07/2016', date_formats=['%A %d/%m/%Y']) 则不起作用。
      • 为什么要这样做?字符串格式完全不同,您需要传递 dateparser.parse('06/07/2016', date_formats=['%d/%m/%Y']) 才能解析该日期,这就是它接受格式字符串的原因
      • 基本上你需要传递一个格式列表来处理任何一种格式,如果某些东西不能正确解析你需要添加更多格式:date_formats=['%d/%m/%Y','%A %d/%m/%Y'] 可以同时使用这两种格式
      • 好的。但是在这种情况下,使用 dateparser 的全部意义就被打败了。无论格式是什么,它都能无缝地提取日期。我现在分叉它以制作印度格式。完成后会回复。
      【解决方案4】:

      您可以使用 date_formats 参数:

      dateparser.parse('Tue, 06/07/2016', date_formats=['%d %B %Y'])
      

      date_formats 链接https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior

      【讨论】:

      • 仍然产生datetime.datetime(2016, 6, 7, 0, 0)
      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2011-03-18
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多