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

时间:2010-07-18 15:46:03

标签: python string date

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

7 个答案:

答案 0 :(得分:125)

使用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)

无效日期会引发ValueError

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

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

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

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

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

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

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

答案 1 :(得分:52)

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

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

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

答案 2 :(得分:15)

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

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

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

pip install datefinder

第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'

注意:如果你期待大量的比赛;然后将不推荐使用类型转换为列表,因为它会产生很大的性能开销。

答案 3 :(得分:1)

您还可以尝试使用dateparser模块,该模块在使用自由文本时可能会比datefinder慢,但它应该涵盖更多的潜在案例和日期格式以及大量的语言。

答案 4 :(得分:0)

使用Pygrok,您可以定义正则表达式语法的抽象扩展。

自定义模式可以%{PATTERN_NAME}格式包含在您的正则表达式中。

您还可以使用冒号%s{PATTERN_NAME:matched_string}分隔为该模式创建标签。如果模式匹配,则该值将作为结果字典的一部分返回(例如result.get('matched_string')

例如:

from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))

结果值将是字典:

{'month': '07', 'day': '10', 'year': '2010'}

如果input_string中不存在date_pattern,则返回值为None。相反,如果您的模式没有任何标签,它将返回一个空字典{}

参考文献:

答案 5 :(得分:0)

传递最好的方法

PyPI 和 GitHub 上有两个很好的模块,它们使我们更容易完成这项任务。那些是

  1. DATEFINDER 模块,用于在文本字符串中查找日期。

安装 pip install datefinder

示例

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'

来源:芬尼·亚伯拉罕

  1. DATERPARSER,对于从 HTML 文件中抓取不同语言格式的日期非常有用,也支持 Hijri 和 Jalali 日历。支持者几乎200 多种不同格式的语言

特点

language agnostic 方式对 200语言区域设置以及多种格式的日期进行通用解析。 相对日期的通用解析,例如:'1 min ago''2 weeks ago''3 months1 week and 1 day ago''in 2 days''tomorrow'.

高级功能

使用时区缩写或UTC偏移量对日期进行通用解析,例如:'August 14, 2015 EST', 'July 4, 2013 PST', '21 July 2013 10:15 pm +0500'. 较长文本中的日期查找。 支持非公历系统。请参阅支持的日历。 广泛的测试覆盖范围。

源代码[示例]

>>> parse('1 hour ago')
datetime.datetime(2015, 5, 31, 23, 0)
>>> parse('Il ya 2 heures')  # French (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)
>>> parse('1 anno 2 mesi')  # Italian (1 year 2 months)
datetime.datetime(2014, 4, 1, 0, 0)
>>> parse('yaklaşık 23 saat önce')  # Turkish (23 hours ago)
datetime.datetime(2015, 5, 31, 1, 0)
>>> parse('Hace una semana')  # Spanish (a week ago)
datetime.datetime(2015, 5, 25, 0, 0)
>>> parse('2小时前')  # Chinese (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)

答案 6 :(得分:-3)

如果您知道日期对象在字符串中的位置(例如在日志文件中),则可以使用.split()[index]提取日期,而无需完全了解格式。

例如:

>>> string = 'monkey 2010-07-10 love banana'
>>> date = string.split()[1]
>>> date
'2010-07-10'