今天我用日期解析和格式化的时间很糟糕。在Python中解析这个日期:2010年11月5日
点的人谁可以解析此日期格式为datetime.date
或datetime.datetime
(我不是太挑剔,但我宁愿.date
):
5th November 2010
今天我用日期解析和格式化的时间很糟糕。在Python中解析这个日期:2010年11月5日
点的人谁可以解析此日期格式为datetime.date
或datetime.datetime
(我不是太挑剔,但我宁愿.date
):
5th November 2010
使用dateutil:
In [2]: import dateutil.parser as dparser
In [3]: date = dparser.parse('5th November 2010')
In [4]: date
Out[4]: datetime.datetime(2010, 11, 5, 0, 0)
如果序数恒定,则:
datetime.strptime(s, '%dth %B %Y')
否则:
date_str = '5th November 2010'
modified_date_str = date_str[0:1] + date_str[3:]
datetime.strptime(modified_date_str, '%d %B %Y')
或者像~unutbu said使用dateutil :)
如果'date_str'是'2010年11月25日',那么你的第二个解决方案就不会工作得很好 - 这就是为什么在我的A中我使用RE而不是普通的字符串切片去除序号后缀; )。 – 2010-08-11 18:24:46
@Alex:你是对的。某些匹配/清除*是必需的。 – 2010-08-12 03:35:13
不幸的是,strptime
是否有 “跳过序数后缀,” 无格式字符 - 所以,我会先做跳绳,用一个小的RE,然后解析结果“清晰”的字符串。即:
>>> import re
>>> import datetime
>>> ordn = re.compile(r'(?<=\d)(st|nd|rd|th)\b')
>>> def parse(s):
... cleans = ordn.sub('', s)
... dt = datetime.datetime.strptime(cleans, '%d %B %Y')
... return dt.date()
...
>>> parse('5th November 2010')
datetime.date(2010, 11, 5)
您的date
VS datetime
偏好是当然没有问题,那就是datetime
对象的.date()
方法是;-)。
第三方扩展如dateutil可能会很有用,如果您需要做很多“模糊”日期解析(或其他花哨的日期相关的东西;-),顺便说一句。
+1不包含第三方模块。尽管dateutil包看起来很棒,但有时候安装第三方模块可能会很麻烦(特别是当开发人员无法100%控制环境时) – shaune 2011-01-10 22:22:36
+1。优雅和Pythonic。 – 2010-08-11 18:11:51
'dateutil'绝对是最干净的。 – Oli 2010-08-11 21:45:26