'2019-07-17T00:00:00.000000000Z'与格式'%Y-%m-%dT%H:%M:%S.%fZ'不匹配



我已经一遍又一遍地检查了这一行,找不到此错误不匹配的位置。也许另一双眼睛可以告诉我?

值错误:时间数据

'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")

这就是上面会起作用


编辑:您可以有两种选择:

  1. 如果纳秒部分的传入字符串始终以 3 个零结尾,则可以将格式调整为 "%Y-%m-%dT%H:%M:%S.%f000Z"

  2. 如果您不确定,那么您可以从输入字符串中修剪掉最后 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)

最新更新