【Python】日付と文字列を相互に変換する方法
日付と文字列の相互変換はstrptime、strftimeでできるが、慣れないうちはどっちがどっちか迷ったり、忘れて調べたりとかはよくある出来事。
- 日付⇒文字列:strftime
- 文字列⇒日付:strptime
また特定のフォーマット形式ならば、isoformat, fromisoformatでも相互に変換が可能である。
日付を文字列に変換する
dateオブジェクト、datetimeオブジェクト共に、strftime, isoformatで日付を文字列に変換できる。
strftimeで文字列に変換
入力される文字列のフォーマットを指定することで、文字列に変換できる。
利用可能書式コードは以下のページで詳細を確認できる。
dateオブジェクト
1from datetime import date
2
3date.today().strftime("%Y/%m/%d")
4# '2022/09/03'
datetimeオブジェクト
1from datetime import datetime
2
3# フォーマットを指定して本日の日付を文字列に変換する
4datetime.today().strftime("%Y-%m-%d")
5# '2022-09-03'
6
7# %Hは24時間表記の時(%Iだと12時間表記の時になる)
8datetime.now().strftime("%Y%m%d_%H%M%S")
9# '20220903_094430'
10
11_date = datetime(2022, 1, 1)
12# datetime.datetime(2022, 1, 1, 0, 0)
13
14_date.strftime("%Y/%m/%d %H:%M:%S")
15# '2022/01/01 00:00:00'
16_date.strftime("%Y/%m/%d %I:%M:%S")
17# '2022/01/01 12:00:00'
指定できるフォーマットにはJan、Januaryなどの月表記やAM・PM表示、週表示など、色々できるので、必要に応じて指定すればいい。
isoformatで変換
こちらは決まった書式で日付が文字列に変換される。
1# dateオブジェクトの変換
2date.today().isoformat()
3# '2022-09-03'
4
5# datetimeオブジェクトの変換
6datetime.now().isoformat()
7# '2022-09-03T09:44:30.323276'
8
9_date = datetime(2022, 1, 1)
10_date.isoformat()
11# '2022-01-01T00:00:00'
dateオブジェクトはyyyy-mm-dd形式で文字列になる。
datetimeオブジェクトはyyyy-mm-ddThh:mm:ss.ffffff形式で文字列になる。
ffffffはマイクロ秒。これが0の場合は表示されない。
特にこだわりや決まりなどがなければ、isoformat()で文字列に変換しても十分だと思う。
マイクロ秒が不要なら削ればいいだけだし。
1datetime.now().isoformat()[:-7]
2# '2022-09-03T09:44:30'
文字列を日付に変換する
datetimeオブジェクトはstrptime, fromisoformatが使える。
dateオブジェクトはfromisoformatのみが使える。
strptimeで文字列をdatetimeに変換
変換対象の文字列と、その文字列の日付としてのフォーマットを指定すればOK。
1# 2022年1月1日 12時34分56秒
2datetime.strptime("20220101_123456", "%Y%m%d_%H%M%S")
3# datetime.datetime(2022, 1, 1, 12, 34, 56)
4
5# 2022年1月
6datetime.strptime("2022/1", "%Y/%m")
7# datetime.datetime(2022, 1, 1, 0, 0)
8# 日付が未指定の場合、月初の日付が初期値として設定される
なお、文字列と書式が合っていない場合、ValueErrorが発生する。
fromisoformatで文字列を日付型に変換
fromisoformat()は日付を文字列に変換したisoformt()の逆を行う。
1# dateオブジェクトに変換
2date.fromisoformat("2022-01-01")
3# datetime.date(2022, 1, 1)
4
5# datetimeオブジェクトに変換
6datetime.fromisoformat("2022-01-01 12:34:56:123456")
7# datetime.datetime(2022, 1, 1, 12, 34, 56, 123456)
8
9datetime.fromisoformat("2022-01-01")
10# datetime.datetime(2022, 1, 1, 0, 0)
11
12datetime.fromisoformat("2022-01-01 12")
13# datetime.datetime(2022, 1, 1, 12, 0)
14
15datetime.fromisoformat("2022-01-01 12:34")
16# datetime.datetime(2022, 1, 1, 12, 34)
datetimeの場合、時分秒はなくても動作する。
文字列を日付に変換する場合、大抵は色々なフォーマットになっていると思うのでstrptimeでその都度、フォーマットを指定して変換することが多いと思う。
まとめ
日付を文字列に変換
1date.today().strftime("%Y/%m/%d")
2# '2022/09/03'
3
4date.today().isoformat()
5# '2022-09-03'
6
7atetime.now().strftime("%Y%m%d_%H%M%S")
8# '20220903_094430'
9
10datetime.now().isoformat()
11# '2022-09-03T09:44:30.323276'
文字列を日付に変換
1date.fromisoformat("2022-01-01")
2# datetime.date(2022, 1, 1)
3
4datetime.strptime("20220101_123456", "%Y%m%d_%H%M%S")
5# datetime.datetime(2022, 1, 1, 12, 34, 56)
6
7datetime.fromisoformat("2022-01-01 12:34:56:123456")
8# datetime.datetime(2022, 1, 1, 12, 34, 56, 123456)