如何解析以“Z”结尾的日期时间?

问题描述 投票:0回答:5

我有以下日期时间字符串

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'

python python-3.x datetime strptime
5个回答
21
投票

理论上,

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)

这可行,但它将纳秒转换为微秒。如果这不行,那么您需要做其他事情。


7
投票

我认为你应该使用 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())

1
投票

正如 @FObersteiner 指出的,

%z
解析
Z
以及
±HHMM[SS[.ffffff]]
时区编码风格。

此信息隐藏在技术细节#6 中。 :-/

之前的错误答案:

回答原来的问题:仅使用标准库无法将“Z”解析为时区。~

这里有一些讨论:https://bugs.python.org/issue35829


0
投票

我喜欢 mx.DateTime 模块

import mx.DateTime as dt
dt.DateTimeFrom('2017-10-18T04:46:53.553472514Z')

0
投票

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
对象,以防您想保持额外的精度

© www.soinside.com 2019 - 2024. All rights reserved.