[解決!Python]日付から曜日を求めるには解決!Python

datetimeモジュールのdatetimeクラスやdateクラスのweekday/isoweekday/strftimeメソッド、calendarモジュールのweekday関数を使って日付から曜日を取得する方法を紹介する。

» 2024年06月18日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

from datetime import datetime, date

day = date(2024, 6, 18# 2024年6月18日

# weekayメソッドは月曜日を0として、日曜日を6として返す
dow = day.weekday()  # day of the week
print(dow)  # 1

# 曜日名に変換する
day_name = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
            'Friday', 'Saturday', 'Sunday']
print(day_name[dow])  # Tuesday

day_name = '月火水木金土日'  # day_name = list('月火水木金土日')でも可
print(day_name[dow])  # 火

# isoweekdayメソッドは月曜日を1として、日曜日を7として返す
dowiso = day.isoweekday()  # day of the week (ISO形式)
print(dowiso)  # 2
print(day_name[dowiso - 1])  # 火

# datetime型のオブジェクトでも同様に曜日を求めることができる
dt = datetime(2024, 6, 18, 12, 34, 56)
dow = dt.weekday()
print(dow)  # 1
print(day_name[dow])  # 火

dowiso = dt.isoweekday()
print(dowiso)  # 2
print(day_name[dowiso - 1])  # 火

# strftimeメソッドを使って曜日名を取得する
dow = day.strftime('%A'# 完全な曜日名の取得
print(dow)  # Tuesday

dow = dt.strftime('%a'# 短縮形の曜日名の取得
print(dow)  # Tue

# ロケールを設定すれば日本語表記も取得できる
import locale

setting = locale.getlocale(locale.LC_TIME)
print(setting)  # (None, None)
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8'# 日付と時刻のロケールを設定

dow = day.strftime('%A')
print(dow)  # 火曜日

dow = day.strftime('%a')
print(dow)  # 火

locale.setlocale(locale.LC_TIME, setting)  # ロケール設定を元に戻す

# 環境変数に従ったロケール設定
locale.setlocale(locale.LC_ALL, '')

dow = day.strftime('%A')
print(dow)  # 火曜日

# calendarモジュールを使って曜日を求める
from calendar import weekday, day_name

dow = weekday(2024, 6, 18)
print(dow)  # 1
print(day_name[dow])  # 火曜日

# format属性の値を変更して短縮形の曜日名を取得
day_name.format = '%a'
print(day_name[dow])  # 火


datetimeモジュールを使って日付から曜日を取得する

 Pythonに標準で付属するdatetimeモジュールは日付や時刻に関する機能を提供する。このうち、datetime.datetimeクラスとdatetime.dateクラスにはweekdayメソッドとisoweekdayメソッドが備わっている。これらのメソッドを使って、datetimeオブジェクトやdateオブジェクトが表している日付から対応する曜日を取得する方法を見ていこう。加えて、strftimeメソッドを使用する方法やcalendarモジュールのweekday関数を使用する方法も紹介する。

 以下はdateクラスのインスタンスを作成して、その曜日を取得する例だ。

from datetime import datetime, date

day = date(2024, 6, 18# 2024年6月18日

# weekayメソッドは月曜日を0として、日曜日を6として返す
dow = day.weekday()  # day of the week
print(dow)  # 1


 weekdayメソッドは呼び出しに使用したdateオブジェクト(またはdatetimeオブジェクト)が表す日付から対応する曜日を返す。戻り値は月曜日を0、日曜日を6とする昇順の値である。上の例ではdateオブジェクトが表す日付である2024年6月18日は火曜日であることから、戻り値は1となる。

 得られた数値から文字列表現の曜日を得るのであれば、次のように曜日を要素としたリストなどを作ればよい。

day_name = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
            'Friday', 'Saturday', 'Sunday']
print(day_name[dow])  # Tuesday

day_name = '月火水木金土日'  # day_name = list('月火水木金土日')でも可
print(day_name[dow])  # 火


 最初の2行は英語表記の曜日を要素とするリストを作成して、取得した値から文字列表記の曜日を得ている。次の2行では、得られた数値を文字列の要素に対するインデックスとして使用している。

 weekdayメソッドは月曜日を0とするが、isoweekdayメソッドは月曜日を1として日曜日を7とする昇順の値を返す。

dowiso = day.isoweekday()  # day of the week (ISO形式)
print(dowiso)  # 2
print(day_name[dowiso - 1])  # 火


 そのため、isoweekdayメソッドの戻り値をリストや文字列のインデックスとして使うときには調整が必要になる点には注意しよう。

 datetimeクラスのインスタンスでも同じことをする例を以下に示しておく。

dt = datetime(2024, 6, 18, 12, 34, 56)
dow = dt.weekday()
print(dow)  # 1
print(day_name[dow])  # 火

dowiso = dt.isoweekday()
print(dowiso)  # 2
print(day_name[dowiso - 1])  # 火


strftimeメソッドによる曜日名の取得

 datetimeクラス/dateクラス(加えてtimeクラス)には日付や時刻を書式化するstrftimeメソッドがあり、その書式を指定するディレクティブ「%A」と「%a」を使うことで日付から曜日を取得できる。「%A」は完全な曜日名を、「%a」は短縮形の曜日名を得るのに使用する。以下に例を示す。

dow = day.strftime('%A'# 完全な曜日名の取得
print(dow)  # Tuesday

dow = dt.strftime('%a'# 短縮形の曜日名の取得
print(dow)  # Tue


 strftimeメソッドに「%A」を渡すと「Tuesday」と完全な曜日名が得られ、「%a」を渡すと「Tue」と短縮形の曜日名が得られている点に注目されたい。

 このとき、localeモジュールのsetlocale関数を使って日付/時刻のロケールを日本語(ja_JP.UTF-8)に設定することで日本語表記の曜日も取得可能だ。

import locale

setting = locale.getlocale(locale.LC_TIME)
print(setting)  # (None, None)
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8'# 日付と時刻のロケールを設定

dow = day.strftime('%A')
print(dow)  # 火曜日

dow = day.strftime('%a')
print(dow)  # 火

locale.setlocale(locale.LC_TIME, setting)  # ロケール設定を元に戻す


 こちらでは「%A」により「火曜日」が、「%a」により「火」が得られている。

 上の例ではLC_TIMEカテゴリを「ja_JP.UTF-8」に設定したが、「setlocale(locale.LC_ALL, '')」にこの関数を呼び出すと現在の環境変数の設定に従ってロケールが設定される(setlocale関数はスレッドセーフではないので、マルチスレッドで何かをしようとするときには注意が必要だ)。

locale.setlocale(locale.LC_ALL, '')

dow = day.strftime('%A')
print(dow)  # 火曜日


calendarモジュールを使って曜日を求める

 calendarモジュールのweekday関数を使うことで日付から曜日を取得できる。この関数に年、月、日の3つの引数を渡すと曜日が返される(上で紹介したweekdayメソッドと同様に月曜日が0、日曜日が6となる)。以下に例を示す。

from calendar import weekday, day_name

dow = weekday(2024, 6, 18)
print(dow)  # 1


 この関数はdatetimeクラスやdateクラスのインスタンスは受け付けないが、単に一時的に特定の日が何曜日かを知りたいだけならこの関数を使うのが簡単だ。

 なお、calendarモジュールにはday_name属性がある。これは現在のロケールに応じた曜日名を格納する配列として使える。「calendar.day_name[1]」のようにすれば火曜日の曜日名が得られるということだ。以下に例を示す(環境変数に対応したロケール設定を使用)。

locale.setlocale(locale.LC_ALL, '')

print(day_name[dow])  # 火曜日


 day_name属性にはformat属性がある。この値を「%a」に変更すれば、短縮形の曜日名が得られる。

day_name.format = '%a'
print(day_name[dow])  # 火


 この例では、format属性の値を「%a」にしたので短縮形の「火」が得られた。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。