10

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

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

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

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

有任何想法吗?

4

3 回答 3

11

我最终编写了一个 Python 模块来做到这一点,我现在已经开源了。它可以在Github上下载,有文档,并且可以使用以下方式从 PyPI 安装:

pip install daterangeparser

对于那些感兴趣的人,该模块通过使用 PyParsing 创建一个完整的解析器来工作, PyParsing是一个很棒(并且非常易于使用)的工具。

于 2013-09-14T12:31:33.877 回答
1

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

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

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

问候

于 2012-04-26T19:36:16.080 回答
1

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

  1. 预处理您的输入,以便获得开始和结束日期(例如:20th June5th July)。在您的第一个示例 ( date_range == 22-24th July 2012) 中,您可以使用date_range.split(' ')[0].split('-'): 这将返回['22', '24th'](只需删除th和类似的)
  2. datetime使用以下日期获取对象dateutil.parserdateutil.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)
于 2013-09-14T12:49:28.783 回答