2009-08-11 72 views
16

我想分析日期这样的成DateTime对象:蟒蛇日期时间strptime通配符

  • 2008年12月12日
  • 2009年1月1日

以下将第一次约会的工作:

datetime.strptime("December 12th, 2008", "%B %dth, %Y") 

但由于后缀为日数('st'),第二秒会失败。那么,strptime中是否存在未公开的通配符?或者更好的方法呢?

回答

18

尝试使用dateutil.parser模块。

import dateutil.parser 
date1 = dateutil.parser.parse("December 12th, 2008") 
date2 = dateutil.parser.parse("January 1st, 2009") 

的其他文档可以在这里找到:http://labix.org/python-dateutil

+0

python-dateutil看起来已经移动了。该文档位于https://dateutil.readthedocs.org/en/latest/,并有链接到它的github repo和pypi页面。 – drevicko 2015-05-15 12:25:36

7

strptime是棘手的,因为它依赖于底层的C库来实现,所以一些细节平台之间的差异。似乎没有办法匹配您需要的字符。但是你可以先清理数据:

# Remove ordinal suffixes from numbers. 
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in) 
# Parse the pure date. 
date = datetime.strptime(date_in, "%B %d, %Y") 
+6

我会担心这会在八月份做什么。 – 2009-08-11 02:44:36

+1

这就是为什么我包含尾随逗号。 – 2009-08-11 02:48:01

+1

我想说你最好在你的正则表达式之前加入 [\ d] {1,2} 。毕竟你想在数字后面匹配后缀,对吧? :-) – Vince 2009-08-11 05:01:10

9

你需要古斯塔沃·尼迈耶的python_dateutil - 一旦它的安装,

>>> from dateutil import parser 
>>> parser.parse('December 12th, 2008') 
datetime.datetime(2008, 12, 12, 0, 0) 
>>> parser.parse('January 1st, 2009') 
datetime.datetime(2009, 1, 1, 0, 0) 
>>> 
1

对于任何人谁像我一样,只是想要的东西,“作品”没有额外的模块,这是一个快速和肮脏的解决方案。

string_list = ["th", "rd", "nd", "st"] 
time = None 
for str in string_list: 
    if (time is not None): 
     break 
    try: 
     match_string = '%B %d' + str +', %Y' 
     time = datetime.strptime("December 12th, 2008", match_string) 
    except Exception: 
     pass