Pythonで日付の型を文字列として出力すると、デフォルトの状態では「yyyy-mm-dd」の形になります。
これを「yyyy/mm/dd」や「yyyy年m月d日」のように任意の書式に変更する方法について実例を用いてわかりやすく解説しています。
日付型が「yyyy-mm-dd」になる例
日付変更の「3つ」の方法
日付のフォーマット(表示書式)を変更するには次の3つの方法があります。
- strftimeメソッド
- formatメソッド
- year, month, dayメソッド(0埋め無し)
日付書式の変更(0埋めあり)
2020/03/05のmmやddのように、03, 05など0埋めがあるパターンの作り方は以下になります。
strftimeメソッドで変更する
.strftime('%Y/%m/%d')
└ 例:「today.strftime(“%Y/%m/%d”)」
└ 「%Y」:西暦 (4桁) の 10進数(※%yは2桁)
└ 「%m」:0埋めした10進数の月(※%Mは分)
└ 「%d」:0埋めした10進数の日にち(%Dはmm/dd/yy)
import datetime as dt
today = dt.date.today() #出力:datetime.date(2020, 3, 22)
today.strftime("%Y/%m/%d")
#出力結果
#'2020/03/22'
出力結果を年、月、日にしたい場合は、strftimeを today.strftime(“%Y年%m月%日”) とします。
なお、出力結果の型は文字列です。(type(today.strftime(“%Y/%m/%d”)) ⇒ str)
formatメソッドで変更する
'{0:%Y/%m/%d}'.format()
└ 例:'{0:%Y/%m/%d}’.format(today)
└ 「0:」何番目の要素に適用するか指定(※省略不可)
※上記例ではtodayの1つしか存在しない
import datetime as dt
today = dt.date.today() #出力:datetime.date(2020, 3, 22)
'{0:%Y/%m/%d}'.format(today)
#出力結果
#'2020/03/22'
formatメソッドのインデックス番号適用例
上記例では、formatの書式の冒頭は「0:」を指定しています。これが、0以外の場合の例を参考として記載しておきます。
この数字で、引数の何番目に指定した書式を適用するかを指示しています。
以下のように3つの変数を用意し、インデックス番号を変えたときの出力結果を見るとわかりやすいです。
#3つの日付を作成
today = dt.date.today()
past = dt.date(2015,1,1)
future = dt.date(2030,1,1)
#インデックス番号を変更(0~2)
'{0:%Y/%m/%d}'.format(today,past,future)
#出力:'2020/03/22'
'{1:%Y/%m/%d}'.format(today,past,future)
#出力:'2015/01/01'
'{2:%Y/%m/%d}'.format(today,past,future)
#出力:'2030/01/01'
日付書式の変更(0埋めなし)
0埋めなしの日付を作成する方法です。先ほどの出力例は yyyy/mm/ddだったので、ここでは漢字yyyy年m月d日で出力しています。
注意点:0埋めなしの指定子はMacとWindowsで異なる
「03/04」ではなく「3/4」のように0埋めなしを指定する指定子は、MacとWindowsによって異なります。
- Windows:「#」をつける(例:「%#m」)
- Mac:「-」をつける(例:「%-m」)
Windows:「#」をつける
指定子 | 意味 |
---|---|
%#m | 月(0埋めなし) |
%#d | 日(0埋めなし) |
%#H | 時間(24時間,0埋めなし) |
%#I | 時間(12時間,0埋めなし) |
%#M | 分(0埋めなし) |
%#S | 秒(0埋めなし) |
Mac:「-」をつける
指定子 | 意味 |
---|---|
%-m | 月(0埋めなし) |
%-d | 日(0埋めなし) |
%-H | 時間(24時間,0埋めなし) |
%-I | 時間(12時間,0埋めなし) |
%-M | 分(0埋めなし) |
%-S | 秒(0埋めなし) |
(参考)【Python】datetimeモジュールの指定子まとめ。macとwindowsの指定方法(%Y, %y, %m, %Mなどの違い)
ここではWindowsの場合を例にコードを記述しています。Macの方は「#」を「-」に変換してください。
strftimeメソッドで変更する
.strftime('%Y/%#m/%#d')
└ 例:「today.strftime(“%Y/%m/%d”)」
└ 「%Y」:西暦 (4桁) の 10進数(※%yは2桁)
└ 「%#m」:0埋めなし10進数の月(※%Mは分)
└ 「%#d」:0埋めなし10進数の日にち(%Dはmm/dd/yy)
today = dt.date.today()
today.strftime("%Y年%#m月%#d日")
#出力結果
#'2020年3月22日
出力結果を年、月、日にしたい場合は、strftimeを today.strftime(“%Y年%m月%日”) とします。
なお、出力結果の型は文字列です。(type(today.strftime(“%Y/%m/%d”)) ⇒ str)
formatメソッドで変更する
'{0:%Y年%#m月%#d日}'.format()
└ 例:'{0:%Y/%m/%d}’.format(today)
└ 「0:」何番目の要素に適用するか指定(※省略不可)
today = dt.date.today()
'{0:%Y年%#m月%#d日}'.format(today)
#出力結果
#'2020年3月22日
year, month, dayメソッドを使う
str(today.year)+"年"+str(today.month)+"月"+str(today.day)+"日"
└ 「.year」:西暦4桁(型:int)
└ 「.month」:0埋めなしの月(型:int)
└ 「.day」:0埋めなしの日付(型:int)
└ 「+」:intとstrはつなげない⇒ intをstrに変換
today = dt.date.today()
str(today.year)+"年"+str(today.month)+"月"+str(today.day)+"日"
#出力結果
#'2020年3月22日
replaceメソッドと条件指定(10は除く)などを組み合わせれば他にも記述方法はあるので、いろいろと試してみてください。
最もシンプルでわかりやすいのは、strftimeメソッドです。