ValueError: time data '2018-12-22T00:41:30.926932Z' does not match format '%Y-%m-%d %H:%M:%S'
ValueError: time data '2018-12-22T00:41:30.926932Z' does not match format '%Y-%m-%d %H:%M:%S'
我在将时间字符串转换为日期时间对象时遇到问题:
我知道这个问题已经被问过几次了,但我一直没能找到解决问题的方法。
这是我的代码:
order['created'] = 2018-12-22T00:41:30.926932Z
created_at = datetime.datetime.strptime(order['created'],'%m/%d/%Y %H:%M:%S.%f').replace(tzinfo=pytz.utc).astimezone(local_tz)
这是我收到的错误消息
ValueError: time data '2018-12-22T00:41:30.926932Z' does not match
format '%m/%d/%Y %H:%M:%S.%f'
第一个问题是您有一个采用这种格式的 ISO 日期:2018-12-22T00:41:30.926932Z
但是您的代码传递给 strptime()
的格式字符串指定了一个美式日期,其中月份在前并且有斜杠。
因此,您需要 "%Y-%m-%dT%H:%M:%S.%f"
而不是 "%m/%d/%Y %H:%M:%S.%f"
。
注意事项:
- 年份 (
%Y
) 在前。
- 连字符不是斜杠。
T
在日期和时间之间,而不是 space。
第二个问题是数据以格林威治标准时间的时区字符串 Z
结尾,但您的代码未将其包含在格式规范中。正确的格式指令是 %z
。所以,在末尾添加 %z
得到 "%Y-%m-%dT%H:%M:%S.%f%z"
.
函数strptime()
准确但不明亮,无法计算出您的格式规范与数据不匹配的地方。您得到的只是一条通用消息,内容为 data does not match format。届时,您需要返回文档以发现不匹配的地方。
最后,.replace(tzinfo=pytz.utc).astimezone(local_tz)
将不起作用,因为(除非您在未提供的代码中定义了 local_tz
),引用 local_tz
将给出 NameError 或 AttributeError:我怀疑你要的是tzlocal.get_localzone()
。您可能需要安装 tzlocal
才能正常工作。 (还有其他方法可以做到这一点,但这种方法最接近您提供的代码。)
解决这三个问题后我得到了
>>> order['created'] = "2018-12-22T00:41:30.926932Z"
注意,您需要在时间戳值周围加上引号,它必须在您的原始代码中才能导致您报告的错误消息,但不在您的问题中。始终 post 给出错误消息的 确切代码 ,而不是重新输入或编辑的版本。
>>> datetime.datetime.strptime(order['created'],'%Y-%m-%dT%H:%M:%S.%f%z').replace(tzinfo=pytz.utc).astimezone(tzlocal.get_localzone())
datetime.datetime(2018, 12, 22, 1, 41, 30, 926932, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)
这是正确的,但可能与您的结果不符,因为我住在海牙。
即使在最好的情况下,处理日期也很棘手,而且几乎总是需要对细节的关注程度令人惊讶。
我在将时间字符串转换为日期时间对象时遇到问题: 我知道这个问题已经被问过几次了,但我一直没能找到解决问题的方法。
这是我的代码:
order['created'] = 2018-12-22T00:41:30.926932Z
created_at = datetime.datetime.strptime(order['created'],'%m/%d/%Y %H:%M:%S.%f').replace(tzinfo=pytz.utc).astimezone(local_tz)
这是我收到的错误消息
ValueError: time data '2018-12-22T00:41:30.926932Z' does not match format '%m/%d/%Y %H:%M:%S.%f'
第一个问题是您有一个采用这种格式的 ISO 日期:2018-12-22T00:41:30.926932Z
但是您的代码传递给 strptime()
的格式字符串指定了一个美式日期,其中月份在前并且有斜杠。
因此,您需要 "%Y-%m-%dT%H:%M:%S.%f"
而不是 "%m/%d/%Y %H:%M:%S.%f"
。
注意事项:
- 年份 (
%Y
) 在前。 - 连字符不是斜杠。
T
在日期和时间之间,而不是 space。
第二个问题是数据以格林威治标准时间的时区字符串 Z
结尾,但您的代码未将其包含在格式规范中。正确的格式指令是 %z
。所以,在末尾添加 %z
得到 "%Y-%m-%dT%H:%M:%S.%f%z"
.
函数strptime()
准确但不明亮,无法计算出您的格式规范与数据不匹配的地方。您得到的只是一条通用消息,内容为 data does not match format。届时,您需要返回文档以发现不匹配的地方。
最后,.replace(tzinfo=pytz.utc).astimezone(local_tz)
将不起作用,因为(除非您在未提供的代码中定义了 local_tz
),引用 local_tz
将给出 NameError 或 AttributeError:我怀疑你要的是tzlocal.get_localzone()
。您可能需要安装 tzlocal
才能正常工作。 (还有其他方法可以做到这一点,但这种方法最接近您提供的代码。)
解决这三个问题后我得到了
>>> order['created'] = "2018-12-22T00:41:30.926932Z"
注意,您需要在时间戳值周围加上引号,它必须在您的原始代码中才能导致您报告的错误消息,但不在您的问题中。始终 post 给出错误消息的 确切代码 ,而不是重新输入或编辑的版本。
>>> datetime.datetime.strptime(order['created'],'%Y-%m-%dT%H:%M:%S.%f%z').replace(tzinfo=pytz.utc).astimezone(tzlocal.get_localzone())
datetime.datetime(2018, 12, 22, 1, 41, 30, 926932, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)
这是正确的,但可能与您的结果不符,因为我住在海牙。
即使在最好的情况下,处理日期也很棘手,而且几乎总是需要对细节的关注程度令人惊讶。