自然语言处理 |使用 dateutil 解析日期。
解析器模块可以解析更多格式的日期时间字符串。没有比dateutil更好的库来解析Python中的日期和时间了。为了查找时区, tz模块提供了一切。当这些模块组合在一起时,它们可以很容易地将字符串解析为时区感知的日期时间对象。
安装 :
dateutil 可以使用 pip 或 easy_install 安装,即sudo pip install dateutil==2.0或sudo easy_install dateutil==2.0 。需要兼容Python 3 的 2.0 版本。完整的文档可以在 http://labix.org/python-dateutil 找到。
代码:解析示例
# importing library
from dateutil import parser
print (parser.parse('Thu Sep 25 10:36:28 2010'))
print (parser.parse('Thursday, 25. September 2010 10:36AM'))
print (parser.parse('9 / 25 / 2010 10:36:28'))
print (parser.parse('9 / 25 / 2010'))
print (parser.parse('2010-09-25T10:36:28Z'))
输出 :
datetime.datetime(2010, 9, 25, 10, 36, 28)
datetime.datetime(2010, 9, 25, 10, 36)
datetime.datetime(2010, 9, 25, 10, 36, 28)
datetime.datetime(2010, 9, 25, 0, 0)
datetime.datetime(2010, 9, 25, 10, 36, 28, tzinfo=tzutc())
只需导入解析器模块并使用日期时间字符串调用 parse()函数。解析器可以返回一个合理的日期时间对象,但它不能解析字符串,它会引发一个 ValueError。
这个怎么运作 :
- 解析器不是寻找可识别的标记,而是猜测这些标记指的是什么。它不使用正则表达式。
- 这些令牌的顺序很重要,因为它使用类似于月/日/年(默认顺序)的日期格式,而其他令牌使用日/月/年格式。
- parse()函数接受一个可选的关键字参数 dayfirst,它默认为 False 来处理这个问题。
- 如果设置为 True,它可以正确解析后一种格式的日期。
parser.parse('16 / 6/2019', dayfirst = True)
输出 :
datetime.datetime(2016, 6, 16, 0, 0)
两位数年份可能会出现另一个排序问题。但 '11-6-19' 是一种模棱两可的日期格式。由于 dateutil 默认为 Month-Day-Year 格式,所以 '11-6-19' 被解析为 2019 年。但是如果将 yearfirst = True 传递给 parse(),则可以解析为 2011 年。
print (parser.parse('11-6-19'))
print (parser.parse('10-6-25', yearfirst = True))
输出 :
datetime.datetime(2019, 11, 6, 0, 0)
datetime.datetime(2011, 6, 19, 0, 0)
dateutil 解析器还可以进行模糊解析并允许忽略日期时间字符串中的无关字符。当parse()遇到未知标记时,将引发默认值为 False 的 ValueError。如果fuzzy = True,通常可以返回一个日期时间对象。