note.nkmk.me

Pythonで日付から曜日や月を文字列(日本語や英語など)で取得

Date: 2018-02-02 / Modified: 2019-01-21 / tags: 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_TIMElocale.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])
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事