note.nkmk.me

Pythonで月の日数・週数を取得

Date: 2019-07-28 / tags: Python, 日時処理

Pythonで任意の月の日数および週数(カレンダー上の週の数)を取得する方法について説明する。標準ライブラリのcalendarモジュールを利用する。

  • 任意の月の日数を取得
  • 任意の月の週数を取得
    • 週の始まりの曜日に注意

calendarモジュールを使ってテキストやHTMLのカレンダーを出力する方法については以下の記事を参照。

スポンサーリンク

任意の月の日数を取得

calendar.monthrange()関数で、月の初日の曜日(月曜が0、日曜が6)と、月の日数のタプルが取得できる。第一引数に年、第二引数に月を指定する。

日数だけを取得したい場合はインデックス[1]と指定すればよい(0始まりの1番目)。

import calendar

print(calendar.monthrange(2019, 1))
# (1, 31)

print(calendar.monthrange(2019, 1)[1])
# 31

うるう年も考慮される。

print(calendar.monthrange(2019, 2)[1])
# 28

print(calendar.monthrange(2020, 2)[1])
# 29

なお、calendarモジュールには月の日数を直接返すcalendar.monthlen()も定義されている。

ただし、calendar.monthlen()はドキュメントに記載されておらず、__all__にも含まれていない。モジュール内でのヘルパー関数としての使用が意図されていると思われるので、calendar.monthrange()を使っておくほうが無難。

print(calendar.monthlen(2019, 1))
# 31

print(calendar.__all__)
# ['IllegalMonthError', 'IllegalWeekdayError', 'setfirstweekday', 'firstweekday', 'isleap', 'leapdays', 'weekday', 'monthrange', 'monthcalendar', 'prmonth', 'month', 'prcal', 'calendar', 'timegm', 'month_name', 'month_abbr', 'day_name', 'day_abbr', 'Calendar', 'TextCalendar', 'HTMLCalendar', 'LocaleTextCalendar', 'LocaleHTMLCalendar', 'weekheader']

print('monthlen' in calendar.__all__)
# False

print('monthrange' in calendar.__all__)
# True

任意の月の週数を取得

calendar.monthcalendar()関数で、カレンダーを二次元リスト(リストのリスト)として取得できる。ここでは見やすいようにpprintを使っている。

import calendar
import pprint

print(calendar.month(2019, 3))
#      March 2019
# Mo Tu We Th Fr Sa Su
#              1  2  3
#  4  5  6  7  8  9 10
# 11 12 13 14 15 16 17
# 18 19 20 21 22 23 24
# 25 26 27 28 29 30 31
# 

pprint.pprint(calendar.monthcalendar(2019, 3))
# [[0, 0, 0, 0, 1, 2, 3],
#  [4, 5, 6, 7, 8, 9, 10],
#  [11, 12, 13, 14, 15, 16, 17],
#  [18, 19, 20, 21, 22, 23, 24],
#  [25, 26, 27, 28, 29, 30, 31]]

カレンダー上の週の数はこの二次元リストに対して組み込み関数len()を適用すると取得できる。

print(len(calendar.monthcalendar(2019, 3)))
# 5

週の始まりの曜日に注意

上の例のように、calendar.monthcalendar()はデフォルトでは週の始まりを月曜日としてカレンダーを生成する。

週の始まりの曜日を変更したい場合はcalendar.setfirstweekday()を使う。

calendar.setfirstweekday(calendar.SUNDAY)

print(calendar.month(2019, 3))
#      March 2019
# Su Mo Tu We Th Fr Sa
#                 1  2
#  3  4  5  6  7  8  9
# 10 11 12 13 14 15 16
# 17 18 19 20 21 22 23
# 24 25 26 27 28 29 30
# 31
# 

pprint.pprint(calendar.monthcalendar(2019, 3))
# [[0, 0, 0, 0, 0, 1, 2],
#  [3, 4, 5, 6, 7, 8, 9],
#  [10, 11, 12, 13, 14, 15, 16],
#  [17, 18, 19, 20, 21, 22, 23],
#  [24, 25, 26, 27, 28, 29, 30],
#  [31, 0, 0, 0, 0, 0, 0]]

print(len(calendar.monthcalendar(2019, 3)))
# 6

週の始まりの曜日によって月に含まれる週の数が異なる場合があるので注意。

calendar.SUNDAYなどの値はただの整数。月曜calendar.MONDAY0、日曜calendar.SUNDAY6calendar.setfirstweekday()には整数値を指定してもよい。

現在の設定はcalendar.firstweekday()で確認できる。

print(calendar.MONDAY)
# 0

print(calendar.SUNDAY)
# 6

calendar.setfirstweekday(0)

print(calendar.firstweekday())
# 0
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事