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)