Pythonで日付から曜日や月を文字列(日本語や英語など)で取得
Pythonの標準ライブラリdatetimeを使うと、日付の文字列からdatetime
オブジェクトを生成して、そこから曜日や月の名前を文字列で取得することができる。ただし、それらの文字列の言語は環境のロケール(国や地域の設定)によって異なる。
ここでは、日付から曜日や月の名前を任意の言語の文字列で取得する方法として以下の2つを説明する。
- localeモジュールでロケールを変更する
- 新たな関数を定義する
datetimeモジュールの基本的な使い方や、日時(日付、時間)と文字列を相互に変換するメソッドstrptime()
, strftime()
についての詳細は以下の記事を参照。
localeモジュールでロケールを変更
Pythonの標準ライブラリに、ロケール設定を制御するlocaleモジュールが用意されている。
環境によって異なるが、例の環境ではstrftime()
メソッドで書式化コード%A
, %a
, %B
, %b
を使うと、曜日・月の名前が英語表記で得られる。
以下の例では日時(日付と時刻)を表すdatetime
オブジェクトを使っているが、日付のみの情報をもつdate
オブジェクトでも同様。
import datetime
import locale
dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan
時刻の書式化に関するロケールカテゴリの設定locale.LC_TIME
をlocale.getlocale()
で確認するとNone
となっている。この結果は環境によって異なる。
print(locale.getlocale(locale.LC_TIME))
# (None, None)
locale.setlocale()
でlocale.LC_TIME
を日本語(UTF-8)ja_JP.UTF-8
に設定すると、日本語表記の曜日・月名が得られる。locale.LC_ALL
ですべてのロケールカテゴリを設定することもできるが、その場合、例えば金額に関する設定locale.LC_MONETARY
などにも影響するので注意。
なお、これらの変更はこのコードの中でのみ有効。システムの環境変数が書き換わるわけではない。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(locale.getlocale(locale.LC_TIME))
# ('ja_JP', 'UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# 月曜日, 月, 1月, 1
ロケール設定を変えれば、英語やドイツ語など、他の言語表記にもできる。
locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Monday, Mon, January, Jan
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%A, %a, %B, %b'))
# Montag, Mo, Januar, Jan
日付の文字列からその日付の曜日を任意の言語で取得したい場合は、
locale.setlocale()
でlocale.LC_TIME
を任意の言語の設定値(ja_JP.UTF-8
など)に変更strptime()
で文字列からdatetime
オブジェクトに変換- その
datetime
オブジェクトでstrftime()
を書式化コード%A
,%a
,%B
,%b
で呼び出し
という流れで実現できる。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
s = '2018-01-01'
s_dow = datetime.datetime.strptime(s, '%Y-%m-%d').strftime('%A')
print(s_dow)
# 月曜日
新たな関数を定義
新たな関数を定義しても実現できる。
datetime
オブジェクトのweekday()
メソッドで、月曜日が0
で日曜日が6
の整数値が得られる。
import datetime
dt = datetime.datetime(2018, 1, 1)
print(dt)
# 2018-01-01 00:00:00
print(dt.weekday())
# 0
print(type(dt.weekday()))
# <class 'int'>
似たメソッドにisoweekday()
があるが、こちらは月曜日が1
で日曜日が7
の整数値を返す。微妙に違うので注意。
print(dt.isoweekday())
# 1
print(type(dt.isoweekday()))
# <class 'int'>
日本語文字列の曜日の名前のリストを定義してweekday()
メソッドで得られた整数値を用いて取り出せば目的が達成できる。
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
print(w_list[dt.weekday()])
# 月曜日
関数化すると以下のようになる。
def get_day_of_week_jp(dt):
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
return(w_list[dt.weekday()])
print(get_day_of_week_jp(dt))
# 月曜日
dt2 = datetime.datetime(2018, 1, 2)
print(dt2)
# 2018-01-02 00:00:00
print(get_day_of_week_jp(dt2))
# 火曜日
日付の文字列からその日付の曜日を日本語で取得したい場合もstrptime()
で文字列からdatetime
オブジェクトに変換するだけで、あとは同じ。
s = '2018年1月10日'
print(get_day_of_week_jp(datetime.datetime.strptime(s, '%Y年%m月%d日')))
# 水曜日
文字列のフォーマットが固定されているのであれば、strptime()
による変換も関数化してもいいかもしれない。
def get_day_of_week_jp_s(s):
return get_day_of_week_jp(datetime.datetime.strptime(s, '%Y年%m月%d日'))
print(get_day_of_week_jp_s(s))
# 水曜日
曜日のリストを所望の言語に対応したものにすれば日本語以外でも同様に処理できる。
月の名前を任意の言語の文字列で取得したい場合も考え方は同じ。datetime
オブジェクトの属性month
で1月が1
、12月が12
となる整数値を取得できるのでこれを利用すればよい。1始まりなのでリストの定義に注意。
print(get_day_of_week_jp_s(s))
# 水曜日
def get_month_jp(dt):
m_list = [None, '睦月', '如月', '弥生', '卯月', '皐月', '水無月', '文月', '葉月', '長月', '神無月', '霜月', '師走']
return(m_list[dt.month])