我试图将字符串转换为datetime对象。 我从新闻源获取的字符串采用以下格式: “星期四,2014年10月16日01:16:17 EDT”
我尝试使用datetime.strptime()来转换它。 即,
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
并收到以下错误:
追踪(最近的呼叫最后):
文件“”,第1行,in datetime.strptime('星期四,2014年10月16日01:16:17 EDT','%a,%d%b%Y%H:%M:%S%Z')
在_strptime中输入文件“C:\ Anaconda \ lib_strptime.py”,第325行 (data_string,format))
ValueError:时间数据'星期四,2014年10月16日01:16:17 EDT'不匹配 格式'%a,%d%b%Y%H:%M:%S%Z'
但是,如果我尝试没有“EDT”的字符串,它就可以了。 即,
datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')
有谁知道如何解析“EDT”部分?
答案 0 :(得分:8)
要解析RFC 2822 format中的日期,您可以使用email
包:
from datetime import datetime, timedelta
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)
注意:parsedate_tz()
假设EDT对应-0400
UTC偏移但在澳大利亚可能不正确,其中EDT为+1100
(在这种情况下,pytz
使用AEDT )即,时区缩写可能不明确。见Parsing date/time string with timezone abbreviated name in Python?
相关Python错误:%Z in strptime doesn't match EST and others。
如果您的计算机使用POSIX时间戳(可能),并且您确定输入日期在您系统的可接受范围内(未来/过去不太远),并且您不需要保留微秒精度然后你可以使用datetime.utcfromtimestamp
:
from datetime import datetime
from email.utils import parsedate_tz, mktime_tz
timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)
答案 1 :(得分:1)
email.utils.parsedate_tz() 解决方案适用于 3 个字母的时区,但不适用于 AEDT 或 CEST 等 4 个字母的时区。如果您需要混合,Parsing date/time string with timezone abbreviated name in Python? 下的答案适用于最常用的时区。