从Python中的字符串中提取日期

dmp*_*pop 64 python string date

如何从像"monkey 2010-07-10 love banana"这样的字符串中提取日期?谢谢!

unu*_*tbu 134

使用python-dateutil:

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)
Run Code Online (Sandbox Code Playgroud)

无效日期提出ValueError:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month
Run Code Online (Sandbox Code Playgroud)

它可以识别多种格式的日期:

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)
Run Code Online (Sandbox Code Playgroud)

请注意,它会猜测日期是否含糊不清:

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)

但它解析模糊日期的方式是可自定义的:

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
Run Code Online (Sandbox Code Playgroud)

  • @Hamish:如果有两个日期(例如"猴子10/01/1980爱7/10/2010香蕉"的情况),它可能会引发一个ValueError,或者(如"猴子10"的情况)/01/1980爱2010-07-10香蕉"`)它可能会错误地将第二个日期误解为表示小时,分钟,秒或时区.`fuzzy = True`赋予它猜测的许可. (3认同)

lun*_*orn 57

如果日期以固定形式给出,您只需使用正则表达式提取日期,使用"datetime.datetime.strptime"来解析日期:

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()
Run Code Online (Sandbox Code Playgroud)

否则,如果日期以任意形式给出,则无法轻松提取.

  • 如果是欧洲格式,例如 20/01/1980,意思是“1980 年 1 月 20 日”怎么办?如果月/日/年超出合理范围怎么办? (2认同)

Fin*_*ham 20

用于从Python中的字符串中提取日期; 可用的最佳模块是日期取景器模块.

您可以按照下面给出的简单步骤在Python项目中使用它.

第1步:安装日期搜索程序包

pip install datefinder
Run Code Online (Sandbox Code Playgroud)

第2步:在您的项目中使用它

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'
Run Code Online (Sandbox Code Playgroud)

注意:如果你期待大量的比赛; 然后类推到列表将不是推荐的方式,因为它将具有很大的性能开销.

  • 这非常好,但当日期字符串之前有冒号(:) 时它不起作用: `string = "Assessment Date: 17-May-2017 at 13:31"` `list(datefinder.find_dates(string.lower) ()))` `#[]` `string = "评估日期 2017 年 5 月 17 日 13:31"` `list(datefinder.find_dates(string.lower()))` `#[datetime.datetime(2017) , 5, 17, 13, 31)]` (4认同)