Pythonで日付から曜日・月を数値・文字列で取得

Modified: | Tags: Python, 日時処理

Pythonで、日付から曜日・月を数値・文字列で取得するには、標準ライブラリdatetimeモジュールやcalendarモジュールを使う。

datetimeモジュールやcalendarモジュールの基本については以下の記事を参照。

日付から曜日を数値で取得: datetime.weekday(), calendar.weekday()

datetime.weekday(), date.weekday()

日時(日付と時間)を表すdatetime.datetimeオブジェクトのweekday()メソッドで、曜日を表す整数値が得られる。月曜日が0で日曜日が6

import datetime

dt = datetime.datetime(2023, 1, 1)
print(dt)
# 2023-01-01 00:00:00

print(dt.weekday())
# 6

print(type(dt.weekday()))
# <class 'int'>

似たメソッドにisoweekday()があるが、こちらは月曜日が1で日曜日が7の整数値を返す。微妙に違うので注意。

print(dt.isoweekday())
# 7

print(type(dt.isoweekday()))
# <class 'int'>

同様に、日付を表すdatetime.dateオブジェクトもweekday()メソッドとisoweekday()メソッドを持つ。

d = datetime.date(2023, 1, 1)
print(d)
# 2023-01-01

print(d.weekday())
# 6

print(d.isoweekday())
# 7

なお、日時を表す文字列をdatetime.datetimeオブジェクトやdatetime.dateオブジェクトに変換するには、strptime()メソッドを使う。

calendar.weekday()

calendarモジュールのweekday()関数は、年・月・日を受け取り、月曜日が0で日曜日が6の整数値を返す。

import calendar

print(calendar.weekday(2023, 1, 1))
# 6

datetime.datetimeオブジェクトやdatetime.dateオブジェクトを使う必要がなく、単純に年・月・日の曜日を取得したい場合はcalendar.weekday()が便利。

日付から曜日を文字列で取得

strftime()メソッドで書式化コード%A, %aを使用

datetime.datetimeオブジェクトやdatetime.dateオブジェクトを任意の書式の文字列に変換するにはstrftime()メソッドを使う。

strftime()メソッドの書式コードにおいて、%Aは曜日名、%aは短縮形の曜日名を表す。例はdatetime.datetimeオブジェクトだが、datetime.dateオブジェクトでも同様。

dt = datetime.datetime(2023, 1, 1)

print(dt.strftime('%A'))
# Sunday

print(dt.strftime('%a'))
# Sun

上の例では英語の曜日名になっているが、%A, %aは実行環境のロケールに応じた言語の曜日名に対応する。

ロケール設定を制御するには、標準ライブラリのlocaleモジュールを使う。

例えば、locale.setlocale()で時刻の書式化に関するロケールカテゴリlocale.LC_TIMEを設定すると、その言語表記の曜日・月名が得られる。

以下の例では、英語、ドイツ語、日本語に設定している。

import locale

locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%A'))
# Sunday

print(dt.strftime('%a'))
# Sun

locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%A'))
# Sonntag

print(dt.strftime('%a'))
# So

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(dt.strftime('%A'))
# 日曜日

print(dt.strftime('%a'))
# 日

locale.LC_ALLですべてのロケールカテゴリを設定することもできるが、その場合、金額に関する設定locale.LC_MONETARYなどにも影響するので注意。

なお、ロケールの変更はこのコードの中でのみ有効。システムの環境変数が書き換わるわけではない。

曜日を表す整数値を文字列に変換

strftime()メソッドの書式化コード%A, %aで変換される文字列とは別の文字列に変換したい場合、上述のweekday()メソッドを使う。

任意の曜日の名前のリストを定義し、weekday()メソッドで得られる曜日を表す整数値をインデックスとして使って取り出す。

datetime.datetimeオブジェクトやdatetime.dateオブジェクトの場合。

w_list = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']

dt = datetime.datetime(2023, 1, 1)
d = datetime.date(2023, 1, 1)

print(w_list[dt.weekday()])
# Su

print(w_list[d.weekday()])
# Su

calendar.weekday()関数を使ってもよい。

print(w_list[calendar.weekday(2023, 1, 1)])
# Su

日付から月を文字列で取得

strftime()メソッドで書式化コード%B, %bを使用

strftime()メソッドの書式コードにおいて、%Bは月名、%bは短縮形の月名を表す。例はdatetime.datetimeオブジェクトだが、datetime.dateオブジェクトでも同様。

import datetime

dt = datetime.datetime(2023, 1, 1)

print(dt.strftime('%B'))
# January

print(dt.strftime('%b'))
# Jan

曜日の例と同様に、別の言語に切り替えたい場合は、localeモジュールを使う。

import locale

locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')
print(dt.strftime('%B'))
# January

print(dt.strftime('%b'))
# Jan

locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
print(dt.strftime('%B'))
# Januar

print(dt.strftime('%b'))
# Jan

locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(dt.strftime('%B'))
# 1月

print(dt.strftime('%b'))
#  1

月を表す整数値を文字列に変換

datetime.datetimeオブジェクトやdatetime.dateオブジェクトのmonth属性で月の値を整数intで取得できる。

dt = datetime.datetime(2023, 1, 1)
print(dt.month)
# 1

print(type(dt.month))
# <class 'int'>

strftime()メソッドの書式化コード%B, %Bで変換される文字列とは別の文字列に変換したい場合、曜日の例と同様に、任意の月の名前のリストを使う。month属性は1から12なので、インデックスとして使う場合は1を引く。

m_list = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'June', 'July', 'Aug.', 'Sept.', 'Oct.', 'Nov.', 'Dec.']

print(m_list[dt.month - 1])
# Jan.

datetime.dateオブジェクトでも同様。

d = datetime.date(2023, 1, 1)
print(d.month)
# 1

print(m_list[d.month - 1])
# Jan.

関連カテゴリー

関連記事