我有以下日期时间字符串
s
:
2017-10-18T04:46:53.553472514Z
我是这样解析的:
t = datetime.strptime(s, '%Y-%m-%dT%H:%M:%SZ')
如何修复ValueError:时间数据
'2017-10-18T04:46:53.553472514Z'
与格式不匹配'%Y-%m-%dT%H:%M:%SZ'
理论上,
t = datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%fZ')
将是正确的格式字符串,因为您也有秒的分数。但它们需要是微秒。你的可能是纳秒,因为
%f
最多只需要 6 位数字。
所以你需要做这样的事情:
t = datetime.datetime.strptime(s.split(".")[0], '%Y-%m-%dT%H:%M:%S')
t = t + datetime.timedelta(microseconds=int(s.split(".")[1][:-1])/1000)
print (t)
这可行,但它将纳秒转换为微秒。如果这不行,那么您需要做其他事情。
我认为你应该使用 dateutil.parser 模块
In [23]: s = "2017-10-18T04:46:53.553472514Z"
In [24]: import dateutil.parser as p
In [25]: p.parse(s)
Out[25]: datetime.datetime(2017, 10, 18, 4, 46, 53, 553472, tzinfo=tzutc())
正如 @FObersteiner 指出的,
%z
解析 Z
以及 ±HHMM[SS[.ffffff]]
时区编码风格。
此信息隐藏在技术细节#6 中。 :-/
之前的错误答案:
回答原来的问题:仅使用标准库无法将“Z”解析为时区。~
我喜欢 mx.DateTime 模块。
import mx.DateTime as dt
dt.DateTimeFrom('2017-10-18T04:46:53.553472514Z')
datetime
是另一个Python内置模块,完全被更好的额外模块取代:arrow
。
你可以这样做:
import arrow
dt = arrow.get('2017-10-18T04:46:53.553472514Z').datetime
您的日期字符串采用标准化 ISO 格式,甚至无需给出格式字符串即可对其进行解析。解析后的
df
将是:
datetime.datetime(2017, 10, 18, 4, 46, 53, 553472, tzinfo=tzutc())
或者保留
Arrow
对象,以防您想保持额外的精度