20

我想将这样的日期解析为 datetime 对象:

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

以下将适用于第一个日期:

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

但由于日期编号('st')的后缀,第二次会失败。那么,strptime 中是否存在未记录的通配符?还是完全更好的方法?

4

5 回答 5

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

于 2009-08-11T02:41:28.897 回答
9

您需要 Gustavo Niemeyer 的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)
>>> 
于 2009-08-11T02:42:26.583 回答
8

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")
于 2009-08-11T02:42:09.423 回答
2

如果您想使用任意通配符,您可以使用datetime-glob,这是我们开发的一个模块,用于从由一致的日期/时间格式生成的文件列表中解析日期/时间。从模块的文档中:

>>> import datetime_glob
>>> matcher = datetime_glob.Matcher(
                         pattern='/some/path/*%Y-%m-%dT%H-%M-%SZ.jpg')

>>> matcher.match(path='/some/path/some-text2016-07-03T21-22-23Z.jpg')
datetime_glob.Match(year = 2016, month = 7, day = 3, 
                    hour = 21, minute = 22, second = 23, microsecond = None)

>>> match.as_datetime()
datetime.datetime(2016, 7, 3, 21, 22, 23)
于 2018-03-25T13:12:06.047 回答
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
于 2017-10-26T15:02:12.257 回答