将字符串转换为datetime对象

Vic*_*Gau 5 python datetime rfc2822

我试图将字符串转换为日期时间对象.我从新闻Feed获得的字符串采用以下格式:"星期四,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')
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

回溯(最近一次调用最后一次):
  文件"",第1行,在datetime.strptime('星期四,2014年10月16日01:16:17 EDT','%a,%d%b%Y%H:%M: %S%Z')
  文件"C:\ Anaconda\lib_strptime.py",第325行,在_strptime(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')
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解析"EDT"部分?

jfs*_*jfs 10

要以RFC 2822格式解析日期,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

注意:parsedate_tz()假设EDT对应于-0400UTC偏移但在澳大利亚可能不正确,其中EDT是+1100(pytz在这种情况下使用AEDT ),即时区缩写可能不明确.请参阅使用Python中的时区缩写名称解析日期/时间字符串?

相关的Python bug:strptime中的%Z与EST和其他不匹配.

如果您的计算机使用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)
Run Code Online (Sandbox Code Playgroud)