問題
Python の日時操作オブジェクトの datetime.datetime
にはマイクロ秒の精度があり、そのまま文字列に直すと、秒にコンマ以下の値が付きます。
>>> from datetime import datetime
>>> str(datetime.now())
'2025-03-15 18:08:36.781144'
ヒトにとっての可読性を上げたいとか、SQL の DATETIME
型(マイクロ秒なしのケース)にそのまま挿入したいとか、諸般の事情で小数点数以下がほしくないこともあります。
以下、その方法をいくつか示します。
①文字列操作で削除する
最も安直な手は文字列操作でしょう。datetime
の文字列表現には .
が1か所しかないことを利用して、str.split('.')
で分割し、最初のものだけを抜き出します。
>>> str(datetime.now()).split('.')[0]
'2025-03-15 18:12:48'
類似の手はいくつかあります。
>>> str(datetime.now())[:19] # 先頭19文字スライス
'2025-03-15 18:17:00'
>>> str(datetime.now())[:-7] # 末尾7文字を削る
'2025-03-15 18:17:29'
>>> import re
>>> re.sub(r'\.\d+', '', str(datetime.now())) # いや、そこまでせんでも...
'2025-03-15 18:20:57'
②フォーマットメソッドを使う
datetime
オブジェクトのメンバーを書式フォーマットにのっとって記述させるよう、datetime.strftime()
メソッドを使う手もあります。おそらく、これが最も教科書的な解法でしょう。
>>> datetime.now().strftime('%Y-%m-%d %H:%M:%S')
'2025-03-15 18:14:16'
③マイクロ秒を強制的に0にする
datetime
オブジェクトのマイクロ秒メンバーを replace()
メソッドで強制的に0に置き換えてから文字列に直すという、凝った技法もあります。文字列化されるとき、マイクロ秒が0ならば表示をしないというあまり知られていないルールを使った手です。
>>> str(datetime.now().replace(microsecond=0))
'2025-03-15 18:26:10'
④ISOフォーマットメソッドを使う
datetime
を yyyy-mm-ddThh:mm:ss
(あるいはそのバリエーション)というISO形式に変換する isoformat()
メソッドを使う手もあります。リファレンスによれば、日と時刻を分ける「T」は sep
キーワード引数で変更でき、時刻のフォーマットは timespec
キーワード変数から選択できます。「時:分:秒」のフォーマットにするなら、timespec="seconds"
です。
>>> datetime.now().isoformat(sep=' ', timespec='seconds')
'2025-03-15 18:28:59'
おわりに
“TMTOWTDI”(There's more than one way to do it)は Perl のスローガンですが、Python でやってみても悪くはないと思います。
他に妙手があったら、お教えください。