一尘不染

将字符串转换为日期时间对象

python

我试图将字符串转换为日期时间对象。我从新闻提要中获取的字符串格式如下:“星期四,2014年10月16日美国东部时间01:16:17”

我尝试使用datetime.strptime()进行转换。即

datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')

并得到以下错误:

追溯(最近一次通话最近):
文件“”,第1行,位于datetime.strptime(’Thu,16 Oct 2014 01:16:17
EDT’,’%a,%d%b%Y%H:%M: %S%Z’)
文件“ C:\ Anaconda \ lib_strptime.py”,第325行,以_strptime(data_string,格式))
ValueError:时间数据’Thu,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”部分?


阅读 128

收藏
2020-12-20

共1个答案

一尘不染

要以RFC
2822格式
解析日期,可以使用emailpackage:

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对应于-0400UTC偏移量,但是在EDT是澳大利亚的情况下可能不正确+1100pytz在这种情况下使用AEDT
),即时区缩写可能不明确。请参阅在Python中解析带有时区缩写名称的日期/时间字符串?

相关的Python错误: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)
2020-12-20