关于python:将字符串转换为datetime对象

Converting string to datetime object

我试图将字符串转换为日期时间对象。我从新闻订阅源获得的字符串格式如下:"2014年10月16日星期四,美国东部夏令时01:16:17"

我尝试使用datetime.strptime()来转换它。即。,

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

得到以下错误:

Traceback (most recent call last):
  File"", line 1, in
datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')
  File"C:\Anaconda\lib_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data 'Thu, 16 Oct 2014 01:16:17 EDT' does not match
format '%a, %d %b %Y %H:%M:%S %Z'

但是,如果我尝试不使用"edt"的字符串,它会起作用。即。,

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

有人知道如何解析这个"edt"部分吗?


要以RFC2822格式解析日期,可以使用email包:

1
2
3
4
5
6
7
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为+1100的澳大利亚可能不正确(在这种情况下,pytz使用edet),即时区缩写可能不明确。看到在python中用时区缩写名称解析日期/时间字符串吗?

相关的python错误:strptime中的%z与est和其他错误不匹配。

如果您的计算机使用POSIX时间戳(可能),并且您确信输入日期在系统可接受的范围内(不太远,将来/过去),并且您不需要保持微秒精度,那么您可以使用datetime.utcfromtimestamp

1
2
3
4
5
6
7
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)