代码之家  ›  专栏  ›  技术社区  ›  Tampa

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

  •  4
  • Tampa  · 技术社区  · 6 年前

    下面是我在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 回复  |  直到 6 年前
        1
  •  3
  •   Jason Baumgartner    6 年前

    您遇到的问题是,您的时间以纳秒为单位,而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表示对datetime来说太大的秒的浮点部分(它是纳米精度),因此我们将其限制为6位数([:-1]删除z,而[:6]只限制为微秒)。这会将分辨率降低到微秒,而不进行取整——只会截断。如果需要舍入,可以将p2转换为float,舍入它,然后转换回str并截断结尾。

    这将把时间的分辨率降低到日期时间可以处理的程度。这也假设您的秒数总是一个浮点数,并将以某个点结束。如果不是,您可能需要调整regex,但我试图尽可能清楚地说明这个示例。

    我相信有一种更简单的方法可以做到这一点,但这一点先在我脑海中闪现,现在已经很晚了。我在考虑直接操作dt字符串,但我不确定9位数是否总是在小数部分。祝你好运!

        2
  •  0
  •   Usman    6 年前

    试试这个

    from time import gmtime, strftime
    import time
    
    print(strftime("%Y-%m-%dT%H:%M:%S.%fZ", gmtime()))
    
        3
  •  0
  •   Bitto    6 年前

    允许的微秒范围是

    0 <= microsecond < 1000000
    

    你可以在这里了解更多 https://docs.python.org/2/library/datetime.html#datetime-objects

    如果给定的参数超出这些范围,则会引发ValueError。 如果删除微秒的最后3个字符( 也就是说,它应该工作得很好。

    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)