HH:MM :: SS.nano_seconds(例:01:02:03.123456789)という形式の時間を含むログファイルがいくつかあります。 pythonで日時を作成したいので、時間を正確に計算できます(たとえば、時差を取る)。strptimeは、%fを使用してマイクロ秒でうまく機能します。 Python datetimeとtimeモジュールは本当にナノ秒をサポートしていませんか?
ソースから を見ると、datetimeオブジェクトはマイクロ秒より細かいものをサポートしていないことがわかります。コメントでMike Penningtonが指摘したように、これは 実際のハードウェアクロックはそれほど正確ではない のためです。ウィキペディアによると [〜#〜] hpet [〜#〜] の周波数は「少なくとも10 MHz」で、100ナノ秒あたり1ティックです。
最後の3桁を破棄しても問題ない場合(おそらくあまり意味がありません)、小数点以下6桁になるように入力文字列をスライスし、%f
で解析することで、これを解析できます。それ以外の場合は、減算を自分で実装する必要があるようです。
numpy
を使用すると、非常に自然にナノ秒とさらに正確な時間単位(ps、fs、as)を使用できます。 Numpyには独自の Datetime and Timedeltas 実装があるため、np.datetime64
:
import numpy as np
def str_to_ns(time_str):
"""
input: time in a format `hh:mm:ss.up_to_9_digits`
"""
h, m, s = time_str.split(":")
int_s, ns = s.split(".")
ns = map(lambda t, unit: np.timedelta64(t, unit),
[h,m,int_s,ns.ljust(9, '0')],['h','m','s','ns'])
return sum(ns)
次に、この関数を次のように使用できます。
>>> src = "1:2:34.123456789"
>>> out = str_to_ns(src)
>>> print(out)
3754123456789 nanoseconds
>>> out / np.timedelta64(1,'h')
1.0428120713302778
>>> out / np.timedelta64(1,'m')
62.568724279816664
>>> out / np.timedelta64(1,'s')
3754.123456789
算術も可能です:
>>> t1, t2 = str_to_ns("1:0:12.12345678"), str_to_ns("1:0:12.12")
>>> t1 - t2
numpy.timedelta64(3456780,'ns')
それは自然ではないことに同意しますこの方法では、numpy
だけで任意の高い時間精度を実現できます。
これは、DatetimeWithNanoseconds
として返されるFirestoreタイムスタンプのドキュメントを探していることがわかりました。 カスタムクラス であることがわかります。
明確にするために、Firestoreはこのクラスの使用にもかかわらずナノ秒を設定していませんが、0.000001
のresolutionプロパティによって示されています。
これは古いスレッドですが、それでも...
Pandas機能を使用してこれを実現できます。「2019-03-22T14:00:01.700311864Z」のようなタイムスタンプがあり、次の方法でタイムスタンプに変換しました:
firstStamp = pd.to_datetime(firstStampString, format='%Y-%m-%dT%H:%M:%S.%fZ')
lastStamp = pd.to_datetime(lastStampString, format='%Y-%m-%dT%H:%M:%S.%fZ')
deltaTime = lastStamp - firstStamp
これは正常に動作します。