Python

【Python】日付と文字列を相互に変換する方法

日付と文字列の相互変換はstrptime、strftimeでできるが、慣れないうちはどっちがどっちか迷ったり、忘れて調べたりとかはよくある出来事。

  • 日付⇒文字列:strftime
  • 文字列⇒日付:strptime

また特定のフォーマット形式ならば、isoformat, fromisoformatでも相互に変換が可能である。

日付を文字列に変換する

dateオブジェクト、datetimeオブジェクト共に、strftime, isoformatで日付を文字列に変換できる。

strftimeで文字列に変換

入力される文字列のフォーマットを指定することで、文字列に変換できる。

利用可能書式コードは以下のページで詳細を確認できる。

strftimeとstrptimeの書式コード

dateオブジェクト

from datetime import date

date.today().strftime("%Y/%m/%d")
>>
'2022/09/03'

datetimeオブジェクト

from datetime import datetime

# フォーマットを指定して本日の日付を文字列に変換する
datetime.today().strftime("%Y-%m-%d")
# '2022-09-03'

# %Hは24時間表記の時(%Iだと12時間表記の時になる)
datetime.now().strftime("%Y%m%d_%H%M%S")
# '20220903_094430'

_date = datetime(2022, 1, 1)
# datetime.datetime(2022, 1, 1, 0, 0)

_date.strftime("%Y/%m/%d %H:%M:%S")
# '2022/01/01 00:00:00'
_date.strftime("%Y/%m/%d %I:%M:%S")
# '2022/01/01 12:00:00'

指定できるフォーマットにはJan、Januaryなどの月表記やAM・PM表示、週表示など、色々できるので、必要に応じて指定すればいい。

isoformatで変換

こちらは決まった書式で日付が文字列に変換される。

# dateオブジェクトの変換
date.today().isoformat()
# '2022-09-03'

# datetimeオブジェクトの変換
datetime.now().isoformat()
# '2022-09-03T09:44:30.323276'

_date = datetime(2022, 1, 1)
_date.isoformat()
# '2022-01-01T00:00:00'

dateオブジェクトはyyyy-mm-dd形式で文字列になる。

datetimeオブジェクトはyyyy-mm-ddThh:mm:ss.ffffff形式で文字列になる。

ffffffはマイクロ秒。これが0の場合は表示されない。

特にこだわりや決まりなどがなければ、isoformat()で文字列に変換しても十分だと思う。

マイクロ秒が不要なら削ればいいだけだし。

datetime.now().isoformat()[:-7]
# '2022-09-03T09:44:30'

文字列を日付に変換する

datetimeオブジェクトはstrptime, fromisoformatが使える。

dateオブジェクトはfromisoformatのみが使える。

strptimeで文字列をdatetimeに変換

変換対象の文字列と、その文字列の日付としてのフォーマットを指定すればOK。

# 2022年1月1日 12時34分56秒
datetime.strptime("20220101_123456", "%Y%m%d_%H%M%S")
# datetime.datetime(2022, 1, 1, 12, 34, 56)

# 2022年1月
datetime.strptime("2022/1", "%Y/%m")
# datetime.datetime(2022, 1, 1, 0, 0)
# 日付が未指定の場合、月初の日付が初期値として設定される

なお、文字列と書式が合っていない場合、ValueErrorが発生する。

fromisoformatで文字列を日付型に変換

fromisoformat()は日付を文字列に変換したisoformt()の逆を行う。

# dateオブジェクトに変換
date.fromisoformat("2022-01-01")
# datetime.date(2022, 1, 1)

# datetimeオブジェクトに変換
datetime.fromisoformat("2022-01-01 12:34:56:123456")
# datetime.datetime(2022, 1, 1, 12, 34, 56, 123456)

datetime.fromisoformat("2022-01-01")
# datetime.datetime(2022, 1, 1, 0, 0)

datetime.fromisoformat("2022-01-01 12")
# datetime.datetime(2022, 1, 1, 12, 0)

datetime.fromisoformat("2022-01-01 12:34")
# datetime.datetime(2022, 1, 1, 12, 34)

datetimeの場合、時分秒はなくても動作する。

文字列を日付に変換する場合、大抵は色々なフォーマットになっていると思うのでstrptimeでその都度、フォーマットを指定して変換することが多いと思う。

まとめ

日付を文字列に変換

date.today().strftime("%Y/%m/%d")
# '2022/09/03'

date.today().isoformat()
# '2022/09/03'

atetime.now().strftime("%Y%m%d_%H%M%S")
# '20220903_094430'

datetime.now().isoformat()
# '2022-09-03T09:44:30.323276'

文字列を日付に変換

date.fromisoformat("2022-01-01")
# datetime.date(2022, 1, 1)

datetime.strptime("20220101_123456", "%Y%m%d_%H%M%S")
# datetime.datetime(2022, 1, 1, 12, 34, 56)

datetime.fromisoformat("2022-01-01 12:34:56:123456")
# datetime.datetime(2022, 1, 1, 12, 34, 56, 123456)