0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

datetime からマイクロ秒を抜く

Posted at

問題

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フォーマットメソッドを使う

datetimeyyyy-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 でやってみても悪くはないと思います。

他に妙手があったら、お教えください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?