rcmdnk's blog

うんこドリル 小数・分数 小学4年生 (うんこドリルシリーズ)

なんとなく右詰めだろうと思ってゼロ埋めしたりしてましたが 左詰めで見てくれる、ということで。

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を入れるとエラーが出ます。

strptimereplaceを同時に使ってるとちょっと混乱する事もありそうなのでちょっと注意。

Sponsored Links
Sponsored Links

« Homebrew 3.6.0リリース starred: GitHubに自分のStarを付けたレポジトリまとめページを作る »

}