datetime.dateteime.strptimeの%f
Pythonの日時を扱うライブラリのdatetimeで、文字列をdatetime.datetime型にするとき、
datetime.datetime.strptime(date_string, format)
の様なかたちでdate_string
という文字列をformat
に従って日時に変換します。
このformat
では年を表す%Y
だったり秒を表す%S
を使って%Y-%m-%d %H:%M:%S
とかして元の文字列に合うように決めてやるわけですが、
%f
というマイクロ秒を表す記号があります。
000000
, 000001
, …, 999999
がExampleとして下のページにもありますが、
この例があるのもあって1
とかは000001
(1マイクロ秒)として変換されると思ってました。
%f| Microsecond as a decimal number, zero-padded to 6 digits.| 000000, 000001, …, 999999
datetime — Basic date and time types — Python 3.10.7 documentation
が、実際には1
を%f
にあてると0.1秒と解釈されます。
このことは更に下にあるNotesのところに書いてあります。
When used with the strptime() method, the %f directive accepts from one to six digits and zero pads on the right. %f is an extension to the set of format characters in the C standard (but implemented separately in datetime objects, and therefore always available).
zero pads on the rightということで。
ミリ秒まで記録してあるデータを変換する際に
>>> str = "2022-09-13 12:34:56.789"
>>> print(datetime.datetime.strptime(f"{str}000", "%Y-%m-%d %H:%M:%S.%f"))
2022-09-13 12:34:56.789000
みたいなことをしてたのは間違ってはいないけど意味がなくて
>>> str = "2022-09-13 12:34:56.789"
>>> print(datetime.datetime.strptime(f"{str}", "%Y-%m-%d %H:%M:%S.%f"))
2022-09-13 12:34:56.789000
と同じ結果になります。
逆に1マイクロ秒とかを変換したい場合には000001
と左に0
を詰めておかないと間違って変換されるので注意が必要です。
replaceでのmicrosecond
datetime.datetimeにはreplace
という関数がありますが、この引数のmicrosecond
に渡す数字は
そのままマイクロ秒として処理されます。
>>> str = "2022-09-13 12:34:56.789"
>>> dt = datetime.datetime.strptime(f"{str}", "%Y-%m-%d %H:%M:%S.%f")
>>> print(dt)
2022-09-13 12:34:56.789000
>>> print(dt.replace(microsecond=1))
2022-09-13 12:34:56.000001
整数型を要求するので000001
を入れるとエラーが出ます。
strptime
とreplace
を同時に使ってるとちょっと混乱する事もありそうなのでちょっと注意。