datetimeモジュールとtimeモジュールには、それらが提供する日付/時刻のデータを書式化するために使えるstrftime関数/メソッドがある。それらの使い方を紹介する。
* 本稿は2021年11月9日に公開された記事をPython 3.11.5で動作確認したものです(確認日:2023年9月11日)。
# datetimeモジュールを使用
import datetime
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
print(repr(now))
# 出力例
#datetime.datetime(2021, 11, 4, 17, 37, 28, 114417, tzinfo=datetime.timezone
#(datetime.timedelta(seconds=32400), 'JST'))
print(now) # 2021-11-04 17:37:28.114417+09:00
# YYYYMMDDhhmmss形式に書式化
d = now.strftime('%Y%m%d%H%M%S')
print(d) # 20211104173728
d = f'{now:%Y%m%d%H%M%S}' # f文字列
d = format(now, '%Y%m%d%H%M%S') # format関数
d = '{:%Y%m%d%H%M%S}'.format(now) # 文字列のformatメソッド
print(d) # 20211104173728
# YYYY/MM/DD hh:mm:ss形式に書式化
d = now.strftime('%Y/%m/%d %H:%M:%S')
print(d) # 2021/11/04 17:37:28
# MM/DD/YY hh:mm:ss形式に書式化
d = now.strftime('%x %X')
print(d) # 11/04/21 17:37:28
# 日付のみを書式化
d = now.date().strftime('%Y/%m/%d')
print(d) # 2021/11/04
# 時刻のみを書式化
t = now.time().strftime('%X')
print(t) # 17:37:28
# 西暦を2桁に
d = now.strftime('%y/%m/%d %H:%M:%S')
print(d) # 21/11/04 17:37:28
# 12時間制+AM/PM表示
d = now.strftime('%Y/%m/%d %I:%M(%p)')
print(d) # 2021/11/04 05:37(PM)
# 曜日を含む日付
d = now.strftime('%Y年%m月%d日(%a)')
print(d) # 2021年11月04日(Thu)
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = now.strftime('%a')
w = d_week[key]
d = now.strftime('%Y年%m月%d日') + f'({w})' #f'{now:%Y年%m月%d日}({w})'
print(d) # 2021年11月04日(木)
d_week = '日月火水木金土日' # インデックス0の'日'は使用されない
idx = now.strftime('%u') # '%u'では月曜日がインデックス'1'となる
w = d_week[int(idx)]
d = now.strftime('%Y年%m月%d日') + f'({w})'
print(d) # 2021年11月04日(木)
# タイムゾーン
d = now.strftime('%X%z(%Z)')
print(d) # 17:37:28+0900(JST)
# timeモジュールを使用
import time
now = time.localtime()
print(now)
# 出力例
#time.struct_time(tm_year=2021, tm_mon=11, tm_mday=4, tm_hour=19, tm_min=40,
#tm_sec=1, tm_wday=3, tm_yday=308, tm_isdst=0)
d = time.strftime('%Y%m%d%H%M%S', now) # YYYYMMDDhhmmssに書式化
d = time.strftime('%Y/%m/%d %H:%M:%S', now) # YYYY/MM/DD hh:mm:ssに書式化
d = time.strftime('%x %X', now) # MM/DD/YY hh:mm:ssに書式化
d = time.strftime('%y/%m/%d %H:%M:%S', now) # YY/MM/DD hh:mm:ssに書式化
d = time.strftime('%Y/%m/%d %I:%M(%p)', now) # 12時間制+AM/PM表示
d = time.strftime('%Y年%m月%d日(%a)', now) # 曜日を含む日付
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = time.strftime('%a', now)
w = d_week[key]
d = time.strftime('%Y年%m月%d日', now) + f'({w})'
print(d) # 2021年11月04日(木)
datetimeモジュールが提供するdatetimeクラス、dateクラス、timeクラスにはstrftimeメソッドがあり、これらを使うことでそれぞれのインスタンスが表す日付や時刻を簡単に書式化できる。
簡単な例を以下に示す。
import datetime
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
print(repr(now))
# 出力例
#datetime.datetime(2021, 11, 4, 17, 37, 28, 114417, tzinfo=datetime.timezone
#(datetime.timedelta(seconds=32400), 'JST'))
print(now) # 2021-11-04 17:37:28.114417+09:00
# YYYYMMDDhhmmss形式に書式化
d = now.strftime('%Y%m%d%H%M%S')
print(d) # 20211104173728
最初にタイムゾーン付きでdatetimeクラスのオブジェクトを作成して、それを表示した後に、YYYYMMDDhhmmss形式に書式化している。strftimeメソッドには、「now.strftime('%Y%m%d%H%M%S')」のように「書式コード」を含んだフォーマット文字列を指定する。なお、print関数の出力にある「2021-11-05 08:08:48.050345+09:00」のような表現が必要なら、「str(now)」のようにstr関数で文字列化するだけでよい。
上の例では「%Y」「%m」「%d」「%H」「%M」「%S」という書式コードを使用している。これらと共に、本稿で紹介する書式コードを以下に示す(全ての書式コードについてはPythonのドキュメント「strftime() と strptime() の書式コード」を参照のこと)。
書式コード | 説明 | 例 |
---|---|---|
%Y | 西暦(4桁表記。0埋め) | 2021 |
%m | 月(2桁表記。0埋め) | 11 |
%d | 日(2桁表記。0埋め) | 04 |
%H | 時(24時間制。2桁表記。0埋め) | 17 |
%M | 分(2桁表記。0埋め) | 37 |
%S | 秒(2桁表記。0埋め) | 28 |
%y | 西暦の下2桁(0埋め) | 21 |
%l | AM/PMを表す文字列 | PM |
%x | 日付をMM/DD/YY形式にしたもの | 11/04/21 |
%X | 時刻をhh:mm:ss形式にしたもの | 17:37:28 |
%a | 曜日の短縮形 | Thu |
%A | 曜日 | Thursday |
%z | 現在のタイムゾーンとUTC(協定世界時)とのオフセット | +0900 |
%Z | 現在のタイムゾーン | JST |
datetimeモジュールのdatetime/dateクラス/timeクラスのstrftimeメソッドで使える書式コード(一部) |
なお、これらの書式コードを使って、f文字列/format関数/文字列のformatメソッドを使って書式化を行うことも可能だ。以下に例を示す。
d = f'{now:%Y%m%d%H%M%S}' # f文字列
d = format(now, '%Y%m%d%H%M%S') # format関数
d = '{:%Y%m%d%H%M%S}'.format(now) # 文字列のformatメソッド
print(d) # 20211104173728
書式コードを含むフォーマット文字列には、書式コード以外も含めてよい。例えば、以下は先ほど取得した時刻を「YYYY/MM/DD hh:mm:ss」形式に書式化する例だ。
d = now.strftime('%Y/%m/%d %H:%M:%S')
print(d) # 2021/11/04 17:37:28
日付を構成する要素の間にスラッシュを、時刻を構成する要素の間にコロンを入れて、それらを半角空白文字でつなぐようにしている。
なお、日付が「MM/DD/YY」という形式でよければ、今見たように複数の書式コードを使わずに「%x」という書式コードを書くだけでもよい。同様に、時刻が「hh:mm:ss」という形式であれば「%X」という書式コードを使える。
d = now.strftime('%x %X')
print(d) # 11/04/21 17:37:28
この他にも、日付を書式化するコードとしては次のようなものが考えられる。
d = now.date().strftime('%Y/%m/%d')
print(d) # 2021/11/04
この例ではdatetimeクラスのインスタンスを基にdateクラスのインスタンスを作成して、そのstrftimeメソッドを呼び出している。このときには「%H」などの書式コードを使用すると例外を発生せずに「00」という値が得られることには注意されたい。
「MM/DD/YY」以外の形式に書式化したいのであれば、datetime.datetime.strftimeメソッドとdatetime.date.strftimeメソッドのいずれを使うにせよ、「%Y」「%m」「%d」か、以下で紹介する「%y」を組み合わせて使うようにしよう。
同様に、時刻だけを書式化するのであれば、先ほど紹介した「%X」に加えて、datetimeモジュールのtimeクラスが持つstrftimeメソッドも使える。timeクラスには日付情報が含まれないので、「%Y」「%m」「%d」などの書式コードを使うと、1900年01月01日となるように書式化が行われることも覚えておこう。
t = now.time().strftime('%X')
print(t) # 17:37:28
「%Y」は西暦を4桁で書式化するが、「%y」は西暦の下2桁を書式化する。
d = now.strftime('%y/%m/%d %H:%M:%S')
print(d) # 21/11/04 17:37:28
「%H」は24時間制として時の初期化を行うが、「%I」は12時間制として書式化する。このとき、AM/PMは「%p」で取り出せる。
d = now.strftime('%Y/%m/%d %I:%M(%p)')
print(d) # 2021/11/04 05:37(PM)
曜日は「%a」か「%A」の書式コードで取り出せる。前者は短縮形を、後者はフルスペルで取り出す。以下はその例だ。
d = now.strftime('%Y年%m月%d日(%a)')
print(d) # 2021年11月04日(Thu)
筆者がWindowsとmacOSのPython処理系で試したところ、「木」ではなく「Thu」と表示された。「木」と表示したいのであれば、以下のような変換テーブル(辞書)を作って、それを使うことが考えられる。
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = now.strftime('%a')
w = d_week[key]
d = now.strftime('%Y年%m月%d日') + f'({w})' #f'{now:%Y年%m月%d日}({w})'
print(d) # 2021年11月04日(木)
これはstrftimeメソッドにフォーマット文字列として「%a」のみを指定して、曜日(短縮形)を取得し、それを辞書のキーとして、漢字表記の曜日を取得するものだ。
あるいは、フォーマット文字列に「%u」を指定すると、月曜日を1、日曜日を7とするインデックス(文字列)が得られるので、これを使って以下のようなコードとすることも考えられる(こちらはPythonの処理系によっては使えない可能性がある)。
d_week = '日月火水木金土日' # インデックス0の'日'は使用されない
idx = now.strftime('%u') # '%u'では月曜日がインデックス'1'となる
w = d_week[int(idx)]
d = now.strftime('%Y年%m月%d日') + f'({w})'
print(d) # 2021年11月04日(木)
「%z」は現在のタイムゾーンのUTC(協定世界時)に対するオフセットを書式化するのに使用する。「%Z」はタイムゾーンの名前を取得する。
d = now.strftime('%X%z(%Z)')
print(d) # 17:37:28+0900(JST)
timeモジュールにはstrftime関数があり、この関数にこれまでに見てきたのと同様なフォーマット文字列と変換したい値(time.localtime関数やtime.gmtime関数が返すstruct_timeクラスのインスタンス)の2つを渡すと、書式化した結果が返される。以下に例を示す。
strftimeがメソッドではなく関数であり、引数に書式化対象の値を渡す以外の使い方は同じなので、コードの解説は省略する。ただし、struct_timeクラスのインスタンスに関してはf文字列やformat関数、文字列のformatメソッドによる書式化はできないことには注意されたい。
import time
now = time.localtime()
print(now)
# 出力例
#time.struct_time(tm_year=2021, tm_mon=11, tm_mday=4, tm_hour=19, tm_min=40,
#tm_sec=1, tm_wday=3, tm_yday=308, tm_isdst=0)
d = time.strftime('%Y%m%d%H%M%S', now) # YYYYMMDDhhmmssに書式化
d = time.strftime('%Y/%m/%d %H:%M:%S', now) # YYYY/MM/DD hh:mm:ssに書式化
d = time.strftime('%x %X', now) # YY/MM/DD hh:mm:ssに書式化
d = time.strftime('%y/%m/%d %H:%M:%S', now) # MM/DD/YY hh:mm:ssに書式化
d = time.strftime('%Y/%m/%d %I:%M(%p)', now) # 12時間制+AM/PM表示
d = time.strftime('%Y年%m月%d日(%a)', now) # 曜日を含む日付
d_week = {'Sun': '日', 'Mon': '月', 'Tue': '火', 'Wed': '水',
'Thu': '木', 'Fri': '金', 'Sat': '土'}
key = time.strftime('%a', now)
w = d_week[key]
d = time.strftime('%Y年%m月%d日', now) + f'({w})'
print(d) # 2021年11月04日(木)
Copyright© Digital Advantage Corp. All Rights Reserved.