【问题标题】:'2019-07-17T00:00:00.000000000Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'“2019-07-17T00:00:00.000000000Z”与格式“%Y-%m-%dT%H:%M:%S.%fZ”不匹配
【发布时间】:2019-07-18 11:43:06
【问题描述】:

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

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

【问题讨论】:

  • 好的,根据下面的答案,json['time'].replace('000', '', 1) 需要在微秒内删除额外的 3 个零。
  • 错误。如果你得到一个带有2000-11-11T11:11:11T00000000Z 的字符串,你就完蛋了
  • 而且,额外的更新没有意义:字符串的来源没有区别。

标签: python python-2.7


【解决方案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 的匹配。

【讨论】:

  • 也许我必须更新我的问题。 {'time':'2019-07-17T00:00:00.000000000Z'} 是我收到的 json 流的一部分,我将其发送到 time.mktime(time.strptime(str(json['time']), '%Y-%m-%dT%H:%M:%S.%fZ')))
  • 我认为这里和重复问题中的答案很清楚你应该做什么。没有人关心,字符串的来源没有任何区别:Python strptime 根本无法解析纳秒。您可以从输入中删除最后几位数字,或者,如果最后 3 位数字始终为零,则可以将这些额外的零放在格式字符串中
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多