連載
» 2021年11月09日 05時00分 公開

[解決!Python]日付や時刻をYYMMDDhhmmssなどの形式に書式化するには解決!Python

datetimeモジュールとtimeモジュールには、それらが提供する日付/時刻のデータを書式化するために使えるstrftime関数/メソッドがある。それらの使い方を紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 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:11(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モジュールが提供する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


西暦を2桁表示

 「%Y」は西暦を4桁で書式化するが、「%y」は西暦の下2桁を書式化する。

d = now.strftime('%y/%m/%d %H:%M:%S')
print(d)  # 21/11/04 17:37:28


12時間制+AM/PM表示

 「%H」は24時間制として時の初期化を行うが、「%I」は12時間制として書式化する。このとき、AM/PMは「%p」で取り出せる。

d = now.strftime('%Y/%m/%d %I:%M(%p)')
print(d)  # 2021/11/04 05:37(PM)


曜日を含む日付

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。