2018年9月25日火曜日

Python datetimeで年月日をゼロ埋めで出力する

年、月、日、時 を yyyy_mm_dd_hh と出力します。1月は01とします。

formatを使う

import datetime

now = datetime.datetime.now()
y = now.year
m = now.month
d = now.day
h = now.hour

'{0}_{1:02d}_{2:02d}_{3:02d}'.format(y, m, d, h)

strftimeを使う

こちらの方が簡単で、よく見ます。
import datetime

# ex. 2021_01_01_00
now = datetime.datetime.now()
now.strftime("%Y_%m_%d_%H")

# ex. 2021-01-01 00:00:00
now.strftime("%Y-%m-%d %H:%M:%S")

%Y 西暦 (4桁) の 10 進表記
%m 0埋めした月
%d  0埋めした日にち
%H  0埋めした時 (24時間表記)
%M 0埋めした分
%S 0埋めした秒

%表記は、大文字と小文字で違う意味になるので注意。
https://docs.python.org/ja/3/library/datetime.html#strftime-and-strptime-format-codes

ゼロ埋めしないなら例えば
import datetime

now = datetime.datetime.now()

# ex. 2021-1-1 0:0:0
f"{now.year}-{now.month}-{now.day} {now.hour}:{now.minute}:{now.second}"

formatで失敗したこと

ゼロ埋めを{0:04d}.format(x)の形で覚えていたので、全部を{0:02d}, {0:02d}としてしまい、エラーが出ていました。

ValueError: cannot switch from automatic field numbering to manual field specification これは以前のpythonの書き方(今も使える)で、現在ではフォーマット設定は左から順に{0} {1}, ... とするのが正しいです。

{}_{1:02d}_{2:02d}_{3:02d}'.format(y, m, d, h)

というように0:を省略することもできません。
(yearは必ず4桁だから0も省略しようとしたらエラー)

0 件のコメント:

コメントを投稿