12

うるう秒のタイムスタンプ datetime を持つデータを解析しています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))

%SPython のドキュメントでは、これはacceptとして問題になるべきではないと主張しています[0, 61]。しかし、上記のタイムスタンプでこのエラーが発生します

nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
ValueError: second must be in 0..59

ありがとう

4

2 に答える 2

8

のドキュメントに%S次のように書かれています:

time モジュールとは異なり、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
于 2014-01-09T19:35:58.587 に答える
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
于 2014-01-09T19:16:20.023 に答える