Python - Datetime не учитывает прыжок второй правильно?
Я разбираю некоторые данные, которые имеют datetime timestampe leapsecond 2012-06-30T23:59:60.209215
. Я использовал следующий код для разбора этой строки и преобразования в объект datetime:
nofrag, frag = t.split('.')
nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
dt = nofrag_dt.replace(microsecond=int(frag))
Документация Python утверждает, что это не должно быть проблемой, поскольку %S
принимает [0, 61]
. Но, я получаю эту ошибку с указанной отметкой времени
nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
ValueError: second must be in 0..59
Спасибо
Ответы
Ответ 1
Сделайте это:
import time
import datetime
t = '2012-06-30T23:59:60.209215'
nofrag, frag = t.split('.')
nofrag_dt = time.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
ts = datetime.datetime.fromtimestamp(time.mktime(nofrag_dt))
dt = ts.replace(microsecond=int(frag))
print(dt)
Выход:
2012-07-01 00:00:00.209215
Ответ 2
Документация для %S
говорит:
В отличие от модуля времени, модуль datetime не поддерживает секунд прыжка.
Строка времени "2012-06-30T23:59:60.209215"
означает, что время находится в UTC (это последняя секундная прыжка на данный момент):
import time
from calendar import timegm
from datetime import datetime, timedelta
time_string = '2012-06-30T23:59:60.209215'
time_string, dot, us = time_string.partition('.')
utc_time_tuple = time.strptime(time_string, "%Y-%m-%dT%H:%M:%S")
dt = datetime(1970, 1, 1) + timedelta(seconds=timegm(utc_time_tuple))
if dot:
dt = dt.replace(microsecond=datetime.strptime(us, '%f').microsecond)
print(dt)
# -> 2012-07-01 00:00:00.209215