2010-08-11 113 views

回答

17

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

+1。优雅和Pythonic。 – 2010-08-11 18:11:51

+0

'dateutil'绝对是最干净的。 – Oli 2010-08-11 21:45:26

5

如果序数恒定,则:

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 :)

+1

如果'date_str'是'2010年11月25日',那么你的第二个解决方案就不会工作得很好 - 这就是为什么在我的A中我使用RE而不是普通的字符串切片去除序号后缀; )。 – 2010-08-11 18:24:46

+0

@Alex:你是对的。某些匹配/清除*是必需的。 – 2010-08-12 03:35:13

10

不幸的是,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可能会很有用,如果您需要做很多“模糊”日期解析(或其他花哨的日期相关的东西;-),顺便说一句。

+0

+1不包含第三方模块。尽管dateutil包看起来很棒,但有时候安装第三方模块可能会很麻烦(特别是当开发人员无法100%控制环境时) – shaune 2011-01-10 22:22:36

相关问题