如何从包含' 2nd'的字符串中获取日期时间在Python中的日期?

时间:2015-01-22 15:03:02

标签: python string datetime

我有几个字符串,我希望得到日​​期时间。它们的格式如下:

Thu 2nd May 2013 19:00

我几乎知道如何将其转换为日期时间,除非我在" 2 nd "中遇到问题。我现在有以下

>>> datetime.strptime('Thu 02 May 2013 19:00', '%a %d %B %Y %H:%M')
datetime.datetime(2013, 5, 2, 19, 0)

在月份的某一天使用零填充数字可以正常工作,但是当我尝试2nd时,它会产生一个ValueError:

>>> datetime.strptime('Thu 2nd May 2013 19:00', '%a %d %B %Y %H:%M')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    (data_string, format))
ValueError: time data 'Thu 2nd May 2013 19:00' does not match format '%a %d %B %Y %H:%M'

the list of datetime directives中,我无法找到与日期的有序值(第1,第2,第3等)相关的任何内容。有谁知道我怎么能让这个工作?欢迎所有提示!

4 个答案:

答案 0 :(得分:8)

考虑使用dateutil.parser.parse

这是第三方库,它有一个强大的解析器,可以处理这些事情。

from dateutil.parser import parse

s = 'Thu 2nd May 2013 19:00'

d = parse(s)
print(d, type(d))
# 2013-05-02 19:00:00 <class 'datetime.datetime'>

一个简短的警告(在你的情况下不会发生):如果dateutil无法在字符串中找到你日期的某个方面(比如你省略了月份),那么它将默认为{ {1}}论点。默认为当前日期,时间为00:00:00。显然,如果需要,您可以使用不同的default对象覆盖此内容。

安装datetime的最简单方法可能是pip使用命令dateutil

答案 1 :(得分:5)

您可以预先填写原始字符串,以便将日期调整为适合您的strptime,例如:

from datetime import datetime
import re

s = 'Thu 2nd May 2013 19:00'
amended = re.sub('\d+(st|nd|rd|th)', lambda m: m.group()[:-2].zfill(2), s)
# Thu 02 May 2013 19:00
dt = datetime.strptime(amended, '%a %d %B %Y %H:%M')
# 2013-05-02 19:00:00

答案 2 :(得分:3)

直接从日期中删除后缀而不使用正则表达式或外部库。

def remove_date_suffix(s):
    parts = s.split()
    parts[1] = parts[1].strip("stndrh") # remove 'st', 'nd', 'rd', ...
    return " ".join(parts)

然后就像你期望的那样简单地使用strptime

>>> s = "Thu 2nd May 2013 19:00"
>>> remove_date_suffix(s)
'Thu 2 May 2013 19:00'
>>> datetime.strptime(remove_date_suffix(s), '%a %d %B %Y %H:%M')
datetime.datetime(2013, 5, 2, 19, 0)

答案 3 :(得分:0)

import re
from datetime import datetime
def proc_date(x):
    return re.sub(r"\b([0123]?[0-9])(st|th|nd|rd)\b",r"\1",x)

>>> x='Thu 2nd May 2013 19:00'
>>> proc_date(x)
'Thu 2 May 2013 19:00'
>>> datetime.strptime(proc_date(x), '%a %d %B %Y %H:%M')
datetime.datetime(2013, 5, 2, 19, 0)