web-dev-qa-db-ja.com

ナノ秒を含む日時文字列の解析

HH:MM :: SS.nano_seconds(例:01:02:03.123456789)という形式の時間を含むログファイルがいくつかあります。 pythonで日時を作成したいので、時間を正確に計算できます(たとえば、時差を取る)。strptimeは、%fを使用してマイクロ秒でうまく機能します。 Python datetimeとtimeモジュールは本当にナノ秒をサポートしていませんか?

20
user1332148

ソースから を見ると、datetimeオブジェクトはマイクロ秒より細かいものをサポートしていないことがわかります。コメントでMike Penningtonが指摘したように、これは 実際のハードウェアクロックはそれほど正確ではない のためです。ウィキペディアによると [〜#〜] hpet [〜#〜] の周波数は「少なくとも10 MHz」で、100ナノ秒あたり1ティックです。

最後の3桁を破棄しても問題ない場合(おそらくあまり意味がありません)、小数点以下6桁になるように入力文字列をスライスし、%fで解析することで、これを解析できます。それ以外の場合は、減算を自分で実装する必要があるようです。

18
Dougal

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だけで任意の高い時間精度を実現できます。

2
Yury Kirienko

これは、DatetimeWithNanosecondsとして返されるFirestoreタイムスタンプのドキュメントを探していることがわかりました。 カスタムクラス であることがわかります。

明確にするために、Firestoreはこのクラスの使用にもかかわらずナノ秒を設定していませんが、0.000001のresolutionプロパティによって示されています。

enter image description here

0
crizCraig

これは古いスレッドですが、それでも...

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

これは正常に動作します。

0
WolfiG