如何从像“monkey 2010-07-10 love banana”这样的字符串中提取日期?谢谢!
答案 0 :(得分:125)
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项目中使用它。
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'
注意:如果你期待大量的比赛;然后将不推荐使用类型转换为列表,因为它会产生很大的性能开销。
答案 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 上有两个很好的模块,它们使我们更容易完成这项任务。那些是
安装
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'
来源:芬尼·亚伯拉罕
以 language agnostic
方式对 200 个语言区域设置以及多种格式的日期进行通用解析。
相对日期的通用解析,例如:'1 min ago'
、'2 weeks ago'
、'3 months
、1 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'