我有几个字符串,我希望得到日期时间。它们的格式如下:
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等)相关的任何内容。有谁知道我怎么能让这个工作?欢迎所有提示!
答案 0 :(得分:8)
这是第三方库,它有一个强大的解析器,可以处理这些事情。
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)