python不会将日期字符串转换为datetime

时间:2018-12-29 07:17:07

标签: python

这是我在python 2.7中的日期时间格式:

dt = "2018-12-28T21:59:59.434645118Z"
now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ")

错误:

ValueError: time data '2018-12-28T21:59:59.434645118Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'

我在%f处有一微秒。我还缺少什么?

谢谢

3 个答案:

答案 0 :(得分:3)

您遇到的问题是您的时间以纳秒为单位,并且Python datetime模块当前不具有纳秒能力。 It is proposed for the future, however

您最好的选择是在应用程序允许的情况下将时间分辨率降低到微秒。

这是解决此问题的方法:

dt = "2018-12-28T21:59:59.434645118Z"
p1,p2 = dt.rsplit('.',1)
new_dt = "{}.{}Z".format(p1,p2[:-1][:6])
now_utc = datetime.datetime.strptime(new_dt, "%Y-%m-%dT%H:%M:%S.%fZ")

p1代表'2018-12-28T21:59:59'

p2代表秒的浮点部分,对于日期时间而言太大(这是纳米精度)-因此我们将其限制为6位数字([:-1]删除Z,[:6]限制为微秒)。这样就可以将分辨率降低到微秒,并且不会四舍五入-只会截断。如果需要舍入,可以将p2强制转换为浮点数,将其舍入,然后强制返回str并截断结尾。

这会将您的时间分辨率降低到datetime可以处理的水平。这还假设您的秒始终是浮动的,并且将以某种形式结束。如果不是这样,您可能需要调整正则表达式,但我尝试使示例尽可能清楚。

我敢肯定有一种更简单的方法可以做到这一点,但是这首先浮现在我的脑海,现在已经很晚了。我当时正在考虑直接处理dt字符串,但不确定9位数字是否总是在小数部分。祝你好运!

答案 1 :(得分:0)

允许的微秒范围是

0 <= microsecond < 1000000

您可以在这里https://docs.python.org/2/library/datetime.html#datetime-objects

了解更多信息

如果给出了超出这些范围的参数,则会引发ValueError。 如果您删除了微秒的最后3个字符( 即。 118)应该可以。

import datetime
dt = "2018-12-28T21:59:59.434645Z"
now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ")
print(now_utc)

一种解决方案是保持微秒子字符串不超过最大值。我相信还有其他方法可以做到这一点。这就是我现在能想到的。

import datetime
max=1000000
dt = "2018-12-28T21:59:59.434645118Z"
dt_list=dt.split('.')
current_micro_sec=dt_list[1][:-1]
while int(current_micro_sec)>max:
    current_micro_sec=current_micro_sec[:-1]
    dt=dt_list[0]+'.'+current_micro_sec+'Z' #keep this inside only if > max otherwise preserve dt
now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ")
print(now_utc)

答案 2 :(得分:0)

尝试

from time import gmtime, strftime
import time

print(strftime("%Y-%m-%dT%H:%M:%S.%fZ", gmtime()))