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

时间:2019-07-18 01:50:04

标签: python python-2.7

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

ValueError:时间数据

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

2 个答案:

答案 0 :(得分:1)

documentation上有一个关于%f的注释(公平的脚注):

  

与strptime()方法一起使用时,%f伪指令接受右边的1到6位数字和零填充。 %f是对C标准格式字符集的扩展(但在日期时间对象中单独实现,因此始终可用)。

如果您从微秒中删除了一些零,则格式字符串可以正常工作:

datetime.strptime('2019-07-17T00:00:00.000000Z', '%Y-%m-%dT%H:%M:%S.%fZ')
# datetime.datetime(2019, 7, 17, 0, 0)

答案 1 :(得分:1)

仅通过调整日期和格式就可以自己发现问题:

失败:

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个匹配项。