我已经一遍又一遍地检查了这一行,找不到此错误不匹配的位置。也许另一双眼睛可以告诉我?
值错误:时间数据
'2019-07-17T00:00:00.000000000Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'
不匹配在哪里?
**更新*****
2019-07-17T00:00:00.000000000Z
是 JSON 流的一部分:
{
"volume": 82,
"mid": {
"h": "1.12286",
"c": "1.12272",
"l": "1.12267",
"o": "1.12274"
},
"complete": true,
"time": "2019-07-17T23:00:00.000000000Z"
},
{
"volume": 10,
"mid": {
"h": "1.12284",
"c": "1.12272",
"l": "1.12272",
"o": "1.12274"
},
"complete": false,
"time": "2019-07-18T00:00:00.000000000Z"
}
这与收到的完全一样,我将time
值发送到此函数中:
time.mktime(time.strptime(str(json['time']), '%Y-%m-%dT%H:%M:%S.%fZ')))
问题,您只需调整日期和格式即可自行解决:
失败:
d = datetime.strptime("2019-07-17T00:00:00.000000000Z", "%Y-%m-%dT%H:%M:%S.%fZ")
成功:
d = datetime.strptime("2019-07-17T00:00:00", "%Y-%m-%dT%H:%M:%S")
这意味着问题来自%fZ
部分。
从 Python 文档中,%f
表示微秒,表示 6 位数字。
d = datetime.strptime("2019-07-17T00:00:00.000000Z", "%Y-%m-%dT%H:%M:%S.%fZ")
这就是上面会起作用
编辑:您可以有两种选择:
如果纳秒部分的传入字符串始终以 3 个零结尾,则可以将格式调整为
"%Y-%m-%dT%H:%M:%S.%f000Z"
如果您不确定,那么您可以从输入字符串中修剪掉最后 3 位数字
您可以执行的一种方法:
input_string = "2019-07-17T00:00:00.000000000Z"
result = datetime.strptime(input_string[:-4], "%Y-%m-%dT%H:%M:%S.%f")
在这里,我从字符串中排除了最后 4 个字符 ( 000Z
(,并相应地更新了格式以删除最后Z
的匹配。
文档有一个关于%f
的注释(公平地说,脚注(:
当与 strptime(( 方法一起使用时,%f 指令接受 1 到 6 位数字和右侧的零位填充。 %f 是 C 标准中格式字符集的扩展(但在 datetime 对象中单独实现,因此始终可用(。
如果从微秒中删除一些零,则格式字符串工作正常:
datetime.strptime('2019-07-17T00:00:00.000000Z', '%Y-%m-%dT%H:%M:%S.%fZ')
# datetime.datetime(2019, 7, 17, 0, 0)