Skip to main content
  1. Posts/

【python】文字列とdatetime型を互いに変換する strftime|strptime

·207 words·1 min
Python Datetime Str
  1. ‘yyyy-mm-dd’ → datetime 型
  2. ’○ 年 ○ 月 ○ 日’ → datetime 型
  3. datetime 型 → ‘yyyy-mm-dd’
  4. datetime 型 → ‘○ 年 ○ 月 ○ 日’

‘yyyy-mm-dd’ → datetime 型
#

文字列を datetime 型に変換するには、strptime メソッドを使います。

第一引数に日付を表す文字列を入れ、第二引数にはstrftime() と strptime() の書式コードを使って、文字列をどのように解釈して datetime 型に変換するかを指定します。

文字列が2021-02-01の場合を考えてみます。
年は 2021、つまり 4 桁の整数ですね。その場合、書式コードより%Yが当てはまります。
月は 02 なので、%mが当てはまります。
そして日にちは 01 より、%dが当てはまります。

文字列に対応する年月日の書式コードが定まったので、文字列がどのような形なのかを指定します。
2021-02-01は年と月、月と日の間を - で区切ってあるので、 %Y-%m-%d という形式ですね。
これをstrptimeの第二引数に渡してやれば OK です。

import datetime
s = '2021-02-01'
dt = datetime.datetime.strptime(s, '%Y-%m-%d')
print(dt, type(dt))   # 2021-02-01 00:00:00 <class 'datetime.datetime'>

‘○ 年 ○ 月 ○ 日’ → datetime 型
#

この形のときも上と同様です。
例えば、2021年2月1日の場合、%Y年%m月%d日を第二引数で指定すれば OK です。

公式ドキュメントには、

%m | 0 埋めした 10 進数で表記した月。 | 01, 02, …, 12

と書いてあるので、0 埋めしていない 2 月や 1 日はどうやってやるんだろうと思いましたが、0 埋めでなくても問題なさそうです。

import datetime
s = '2021年2月1日'
dt = datetime.datetime.strptime(s, '%Y年%m月%d日')
print(dt, type(dt)) # 2021-02-01 00:00:00 <class 'datetime.datetime'>

datetime 型 → ‘○ 年 ○ 月 ○ 日’
#

datetime 型を文字列に変換するには、strftime()メソッドを使います。

strptime とは違い、これはインスタンスメソッドなので、datetime オブジェクトから呼び出します。
引数には strptime の第二引数と同様に、書式コードに従って書式を指定します。

例えば、2021-02-01のような文字列を作りたい場合は、dt.strftime("%Y-%m-%d")としてやればハイフン区切りの日付を出力できます。

import datetime
dt = datetime.datetime(year=2021,month=2,day=10)
s = dt.strftime("%Y-%m-%d")
print(s, type(s))   # 2021-02-10 <class 'str'>

datetime 型 → ‘yyyy-mm-dd’
#

こちらも同様に strftime を使います。 しかし、日本語で%m と%d は 10 進数を 0 埋めした月と日にちなので、1 桁の月日は 02 月 01 日のように表示されてしまいます。

import datetime
dt = datetime.datetime(year=2021,month=2,day=10)
s = dt.strftime("%Y年%m月%d日")
# 2021年02月10日 と出力されてしまう

0 埋めしないようにするには、%と Y,m,d のそれぞれの間に-をつけてやれば良いです。
これはざっと見た感じドキュメントに見当たりませんでした。
昔どこかのブログで他の言語でこの方法があったので、python でも試したらできました。

import datetime
dt = datetime.datetime(year=2021,month=2,day=10)
s = dt.strftime("%Y年%-m月%-d日")
# 2021年2月10日