calendarモジュールは、calコマンドのようなカレンダーの出力を行ったり、そのようなカレンダーを作成するための便利な機能や提供しています。
calコマンドとは以下のような出力を行うコマンドです。
$ cal
6月 2023
日 月 火 水 木 金 土
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
そのほか、閏年を確認するためのメソッドなど、カレンダーに関する便利な機能を提供しています。
カレンダーを出力するのではなく、カレンダーの特定の日付などのデータを扱う場合は標準ライブラリのdatetimeモジュールを使います。datetimeモジュールは次の記事で詳しく解説していますので、よろしかったらご参照ください。
閏年を確認する — isleap()、leapdays()
カレンダーモジュールには閏年か検査するためのクラスメソッドが提供されています。
isleap()は引数に渡された年が閏年ならTrue、そうでなければFalseを返します。
>>> import calendar
>>> calendar.isleap(2023)
False
>>> calendar.isleap(2024)
True
2024年は閏年です。
ある期間に何回の閏年があるか知りたければleapdays()を使います。leapdays()の引数に開始年と終了年を渡して呼び出すと、その期間(終了年は含まれない)の閏年の数を返します。
>>> calendar.leapdays(2000, 2024)
6
struct_timeオブジェクトの時刻をUNIX時間に変換する — timegm()
クラスメソッドtimegm()は少し毛色が違うメソッドですが、カレンダーモジュールで定義されています。
timegm()は、timeモジュールのgmtime()メソッドが返すstruct_timeオブジェクトの時刻をUNIX時間に変換します。
>>> import calendar, time
>>> gm = time.gmtime()
>>> calendar.timegm(gm)
1685593600
カレンダーの出力
calendarモジュールを使うと、calコマンドのようなカレンダーを出力することも簡単にできます。
クラスメソッドprmonth()は、引数として渡された年と月のカレンダーを標準出力へ出力します。
>>> calendar.prmonth(2023, 6)
June 2023
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
このように出力する文字列だけが欲しければ、クラスメソッドcalendar.month()で得られます。
>>> month_str = calendar.month(2023, 6)
>>> month_str
' June 2023\nMo Tu We Th Fr Sa Su\n 1 2 3 4\n 5 6 7 8 9 10 11\n12 13 14 15 16 17 18\n19 20 21 22 23 24 25\n26 27 28 29 30\n'
>>> print(month_str, end='')
June 2023
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
デフォルトでカレンダーは月曜日から始まりますが、他の曜日から始めることもできます。それにはクラスメソッドsetfirstweekday()を使います。現在、週が何曜日から始まるかはクラスメソッドfirstweekday()で得ることができます。
calendarモジュールでは曜日を示すために整数を使います。0は月曜日、6は日曜日を表します。また、calendarモジュールの属性として曜日を表す定数も定義されています。曜日を引数として受け入れるメソッドには整数の代わりにこの定数を使うこともできます。
- calendar.MONDAY
- calendar.TUESDAY
- calendar.WEDNESDAY
- calendar.THURSDAY
- calendar.FRIDAY
- calendar.SATURDAY
- calendar.SUNDAY
setfirstweekday()には週の始めの曜日を整数か上述の定数を渡して呼び出します。
>>> calendar.firstweekday()
0
>>> calendar.setfirstweekday(calendar.SUNDAY)
>>> calendar.firstweekday()
6
>>> calendar.prmonth(2023, 6)
June 2023
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
標準出力に1年分のカレンダーを出力するクラスメソッドprcal()もあります。デフォルトでは3列で出力されます。出力のための文字列だけが必要ならクラスメソッドcalendar()で得られます。
>>> calendar.prcal(2023)
2023
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 7 1 2 3 4
3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
24 25 26 27 28 29 30 29 30 31 26 27 28 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3
3 4 5 6 7 8 9 7 8 9 10 11 12 13 4 5 6 7 8 9 10
10 11 12 13 14 15 16 14 15 16 17 18 19 20 11 12 13 14 15 16 17
17 18 19 20 21 22 23 21 22 23 24 25 26 27 18 19 20 21 22 23 24
24 25 26 27 28 29 30 28 29 30 31 25 26 27 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 1 2 3 4 5 1 2 3
2 3 4 5 6 7 8 6 7 8 9 10 11 12 4 5 6 7 8 9 10
9 10 11 12 13 14 15 13 14 15 16 17 18 19 11 12 13 14 15 16 17
16 17 18 19 20 21 22 20 21 22 23 24 25 26 18 19 20 21 22 23 24
23 24 25 26 27 28 29 27 28 29 30 25 26 27 28 29 30 31
30 31
その他のユーティリティ
クラスメソッドmonthrange(year, month)は、yearとmonthで指定された月の1日の曜日とその月の日数を返します。
>>> calendar.monthrange(2023, 6)
(3, 30)
タプルの1つ目の要素は1日が木曜日(3)であることを示し、2つ目の要素は6月の日数が30日であることを示しています。
クラスメソッドweekday(year, month, day)は、与えられた日の曜日を返します。
>>> calendar.weekday(2023, 6, 1)
3
クラスメソッドはmonthcalendar(year, month)は、与えられた月のカレンダーを行列で返します。各行は週を表し、月の範囲外の日は0になります。
>>> import calendar, pprint
>>> monthcal = calendar.monthcalendar(2023, 6)
>>> pprint.pprint(monthcal)
[[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, 0, 0]]
週の最初の曜日はsetfirstweekday()で変更できます。
おわりに
この記事ではユーティリティとして提供されているクラスメソッドについて説明しましたが、calendarモジュールではいくつかのクラスも提供されています。これらのクラスにはカレンダーを作成するために有益な機能がたくさんあります。カレンダーを作成する必要があるとき以外、あまり必要のない機能なのでこれ以上は深く取り上げませんが、興味があれば調べてみてください。