Pythonで日付から曜日・月を数値・文字列で取得
Pythonで、日付から曜日・月を数値・文字列で取得するには、標準ライブラリdatetimeモジュールやcalendarモジュールを使う。
datetimeモジュールやcalendarモジュールの基本については以下の記事を参照。
- 関連記事: Pythonのdatetimeで日付や時間と文字列を変換(strftime, strptime)
- 関連記事: Pythonのcalendarでカレンダーを取得・出力(テキスト、HTMLなど)
日付から曜日を数値で取得: 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.