将字符串转换为datetime对象

时间:2014-10-18 01:45:10

标签: python datetime rfc2822

我试图将字符串转换为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”部分?

2 个答案:

答案 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? 下的答案适用于最常用的时区。