日付 時刻

【Python】カレンダーを生成する方法 ~ calendar ~

【Python】カレンダーを生成する方法 _ calendar _

Pythonでカレンダーを生成するためのcalendarモジュールの使い方の基本について解説します。

カレンダーを生成する ~ calendar ~

Pythonで日付や時刻を操作する場合には、datetimeモジュールを使用します。しかし、プログラムを作成している場合には、カレンダーを使いたくなることもよくあります。

このような場合に、Pythonではカレンダーの生成に特化したcalendarモジュールが用意されています。この記事では、カレンダーの生成等の操作について説明します。

カレンダーを文字列として取得する month

calendarモジュールを使用したい場合には、以下の例のようにmonth関数を使用して表示したい年月を指定します。

import calendar

# カレンダー形式で出力する
# (第1引数:「年」、第2引数:「月」、第3引数:「1日を表現する文字幅」)
print(calendar.month(2022, 1, 4))
【実行結果】
           January 2022
Mon  Tue  Wed  Thu  Fri  Sat  Sun
                           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

month関数は、第1引数:「年」、第2引数:「月」、第3引数:「1日を表現する文字幅」となっています。

カレンダーの最初の曜日を指定する setfirstweekday

month関数でカレンダーを取得すると月曜始まりのカレンダーが取得されます。しかし、場合によっては日曜始まりの関数などが欲しい場合もあります。

その場合には、以下の例のように事前にsetfirstweekday関数を使って最初の曜日を指定します。

import calendar

# setfirstweekdayでカレンダーの最初になる曜日を指定する。(デフォルトは月曜)
# 0:月 1:火 2:水 3:木 4:金 5:土 6:日

# 日曜を最初に設定する
calendar.setfirstweekday(6)
print(calendar.month(2022, 1, 4))

# (あまり使う機会はないかもしれないが)火曜を最初に設定する
calendar.setfirstweekday(1)
print(calendar.month(2022, 1, 4))
【実行結果】
           January 2022
Sun  Mon  Tue  Wed  Thu  Fri  Sat
                                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

           January 2022
Tue  Wed  Thu  Fri  Sat  Sun  Mon
                      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

setfirstweekdayは数値で最初の曜日を指定します。数値と曜日の対応は「0:月 1:火 2:水 3:木 4:金 5:土 6:日」となっています。デフォルトの曜日は月曜です。

カレンダーをリスト形式で取得する monthcalendar

カレンダーの数値をリストとして取り込んで使用したい場合には、monthcalendar関数を用いて以下のようにすることができます。

import calendar

# monthcalendar関数でカレンダーをリストとして取得する
calendar_list = calendar.monthcalendar(2022, 1)
print(calendar_list)
【実行結果】
[[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]]

上記の例のように取得したリストでは当該月に日がない部分には「0」が設定されます。このようにリストにカレンダーを取得して活用することが可能です。

閏年の判定に関する処理

calendarモジュールは、閏年の判定に関する処理もあります。

閏年かどうかを判定する isleap

対象の年が閏年かどうかを判定するにはisleap関数を使用します。

import calendar

# 閏年を判定する
print(calendar.isleap(2020))
print(calendar.isleap(2022))
【実行結果】
True
False

指定した期間の閏年の回数を計算する leapdays

指定した年の範囲の中で何回閏年であったかの回数を計算するには、leapdays関数を使用します。

import calendar

# 閏年の回数を調べる
print(calendar.leapdays(2000, 2022))
【実行結果】
6

2000年から2022年までの間で閏年なのは、「2000年」「2004年」「2008年」「2012年」「2016年」「2020年」の6回です。

Note

calendarモジュールの公式ドキュメントの記載はこちらを参照してください。