【问题标题】:Parse human-format date ranges in Python在 Python 中解析人类格式的日期范围
【发布时间】:2012-04-26 19:25:46
【问题描述】:

我有一些人类风格的日期范围,在字符串中,如下所示:

22-24th April 2012
14-23 July
20th June - 5th July

我想在 Python 中解析这些,以便最终得到两个日期时间对象:一个用于开始,一个用于结束。

是否有任何模块可以让我这样做?我试过parsedatetime,它看起来像其中的evalRange 函数可以做到这一点(有关文档,请参阅http://code-bear.com/code/parsedatetime/docs/index.html),但它似乎根本不解析任何东西,只是返回当前日期/时间,两次。

有什么想法吗?

【问题讨论】:

  • robin,恕我直言——这些字符串的多样性正则表达式和自定义逻辑是你最好的选择。 -dc

标签: python parsing datetime date


【解决方案1】:

我最终编写了一个 Python 模块来执行此操作,现在我已经将其开源。它可以在Github 上下载,有documentation,它可以从 PyPI 使用:

pip install daterangeparser

对于感兴趣的人,该模块的工作原理是使用 PyParsing 创建一个完整的解析器,这是一个很棒(而且非常易于使用)的工具。

【讨论】:

    【解决方案2】:

    您可以使用dateutil.parser。但它不处理日期范围。您之前可能需要应用正则表达式。

    import dateutil.parser
    dateutil.parser.parse("20th June")
    

    返回datetime.datetime(2012, 6, 20, 0, 0)

    问候

    【讨论】:

      【解决方案3】:

      根据之前的答案,您可以做的是:

      1. 预处理您的输入,以便获得开始和结束日期(例如:20th June5th July)。在您的第一个示例 (date_range == 22-24th July 2012) 中,您可以使用 date_range.split(' ')[0].split('-') 执行此操作:这将返回 ['22', '24th'](只需删除 th 和类似名称)
      2. 使用dateutil.parser从这些日期获取datetime对象:dateutil.parser.parse('22 July 2012')

      这是前面所说的实现:

      import dateutil.parser
      date_range = '20-22th July 2013'
      date_range = date_range.lower()
      for suffix in {'th', 'rd', 'st'}:
          date_range.replace(suffix, '')
      days = date_range.split(' ')[0].split('-')
      month_year = date_range.split(' ')[1]
      begin, end = days[0] + ' ' + month_year, days[1] + ' ' + month_year
      begin_date = dateutil.parser.parse(begin)
      end_date = dateutil.parser.parse(end)
      

      【讨论】:

        猜你喜欢
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        相关资源
        最近更新 更多