日時

[Python] calendarモジュールの使い方をわかりやすく解説

Pythonのcalendarモジュールは、カレンダー関連の操作を簡単に行うための標準ライブラリです。

主な機能として、特定の年や月のカレンダーをテキストやHTML形式で表示したり、曜日や閏年の判定ができます。

例えば、calendar.month(2023, 10)で2023年10月のカレンダーを表示できます。

また、calendar.isleap(2024)で2024年が閏年かどうかを確認できます。

曜日は0が月曜日、6が日曜日として扱われます。

calendarモジュールとは

Pythonのcalendarモジュールは、カレンダーに関連する機能を提供する標準ライブラリです。

このモジュールを使用することで、月や年のカレンダーを表示したり、特定の日付の曜日を取得したり、閏年の判定を行ったりすることができます。

プログラム内で日付や時間に関する処理を行う際に非常に便利です。

calendarモジュールの概要

calendarモジュールは、以下のような機能を持っています。

機能説明
月単位のカレンダー表示特定の月のカレンダーを表示することができる
年単位のカレンダー表示特定の年のカレンダーを表示することができる
曜日や日付の操作特定の日付の曜日を取得したり、月の日数を取得できる
閏年の判定年が閏年かどうかを判定することができる

インポート方法

calendarモジュールを使用するには、まずインポートする必要があります。

以下のように記述します。

import calendar

このインポート文を追加することで、calendarモジュールの機能を利用できるようになります。

主な機能の紹介

calendarモジュールには多くの便利な関数があります。

以下にいくつかの主な機能を紹介します。

  • calendar.month(year, month):指定した年と月のカレンダーを文字列として返します。
  • calendar.calendar(year):指定した年のカレンダーを文字列として返します。
  • calendar.weekday(year, month, day):指定した日付の曜日を整数で返します(0が月曜日、6が日曜日)。
  • calendar.isleap(year):指定した年が閏年かどうかを判定し、真偽値を返します。

これらの機能を活用することで、さまざまなカレンダー関連の処理を簡単に行うことができます。

カレンダーの表示

calendarモジュールを使用すると、月単位や年単位のカレンダーを簡単に表示することができます。

ここでは、具体的な関数の使い方とカスタマイズ方法について解説します。

calendar.month()で月単位のカレンダーを表示

calendar.month(year, month)関数を使用すると、指定した年と月のカレンダーを表示できます。

以下はその使用例です。

import calendar
# 2023年の3月のカレンダーを表示
year = 2023
month = 3
print(calendar.month(year, month))

このコードを実行すると、2023年3月のカレンダーが表示されます。

出力結果は以下のようになります。

     March 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 31

calendar.calendar()で年単位のカレンダーを表示

calendar.calendar(year)関数を使用すると、指定した年のカレンダーを表示できます。

以下はその使用例です。

import calendar
# 2023年のカレンダーを表示
year = 2023
print(calendar.calendar(year))

このコードを実行すると、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

カレンダーのカスタマイズ

calendarモジュールでは、カレンダーの表示をカスタマイズすることも可能です。

以下に、開始曜日の変更とカレンダーのフォーマット変更について説明します。

開始曜日の変更

デフォルトでは、カレンダーは月曜日から始まりますが、calendar.setfirstweekday(weekday)関数を使用することで、開始曜日を変更できます。

曜日は整数で指定し、0が月曜日、6が日曜日です。

以下はその使用例です。

import calendar
# 開始曜日を日曜日に変更
calendar.setfirstweekday(calendar.SUNDAY)
# 2023年3月のカレンダーを表示
year = 2023
month = 3
print(calendar.month(year, month))

このコードを実行すると、2023年3月のカレンダーが日曜日から始まります。

カレンダーのフォーマット変更

calendarモジュールでは、カレンダーのフォーマットを変更することもできます。

calendar.TextCalendar()クラスを使用して、カスタムフォーマットのカレンダーを作成できます。

以下はその使用例です。

import calendar
# カスタムフォーマットのカレンダーを作成
text_calendar = calendar.TextCalendar(firstweekday=5)  # 土曜日から始まるカレンダー
year = 2023
month = 3
print(text_calendar.formatmonth(year, month))

このコードを実行すると、土曜日から始まるカスタムフォーマットの2023年3月のカレンダーが表示されます。

曜日や日付の操作

calendarモジュールを使用すると、特定の日付に関連する曜日や日数を簡単に取得できます。

ここでは、特定の日の曜日を取得する方法や、月の最初の曜日と日数を取得する方法について解説します。

calendar.weekday()で特定の日の曜日を取得

calendar.weekday(year, month, day)関数を使用すると、指定した日付の曜日を整数で取得できます。

0が月曜日、6が日曜日を表します。

以下はその使用例です。

import calendar
# 2023年3月15日の曜日を取得
year = 2023
month = 3
day = 15
weekday = calendar.weekday(year, month, day)
print(f"{year}年{month}月{day}日の曜日は、{weekday}です。")

このコードを実行すると、2023年3月15日の曜日が整数で表示されます。

出力結果は以下のようになります。

2023年3月15日の曜日は、2です。

(ここで、2は水曜日を表します。)

calendar.monthrange()で月の最初の曜日と日数を取得

calendar.monthrange(year, month)関数を使用すると、指定した月の最初の曜日とその月の日数を取得できます。

この関数は、最初の曜日を整数で、日数を整数で返します。

以下はその使用例です。

import calendar
# 2023年3月の最初の曜日と日数を取得
year = 2023
month = 3
first_weekday, num_days = calendar.monthrange(year, month)
print(f"{year}年{month}月の最初の曜日は{first_weekday}、日数は{num_days}です。")

このコードを実行すると、2023年3月の最初の曜日と日数が表示されます。

出力結果は以下のようになります。

2023年3月の最初の曜日は2、日数は31です。

(ここで、2は水曜日を表し、31はその月の日数を示します。)

calendar.day_nameで曜日名を取得

calendar.day_nameを使用すると、曜日の名前を取得できます。

これは、曜日の整数をインデックスとして使用することで、対応する曜日名を取得することができます。

以下はその使用例です。

import calendar
# 2023年3月15日の曜日を取得
year = 2023
month = 3
day = 15
weekday = calendar.weekday(year, month, day)
# 曜日名を取得
day_name = calendar.day_name[weekday]
print(f"{year}年{month}月{day}日の曜日は、{day_name}です。")

このコードを実行すると、2023年3月15日の曜日名が表示されます。

出力結果は以下のようになります。

2023年3月15日の曜日は、Wednesdayです。

このように、calendarモジュールを使用することで、特定の日付に関連する曜日や日数を簡単に取得することができます。

閏年の判定

閏年は、通常の年よりも1日多い366日から成る年です。

Pythonのcalendarモジュールを使用すると、閏年の判定や閏年の数をカウントすることができます。

ここでは、calendar.isleap()calendar.leapdays()の使い方について解説します。

calendar.isleap()で閏年かどうかを判定

calendar.isleap(year)関数を使用すると、指定した年が閏年かどうかを判定できます。

この関数は、閏年であればTrueを、そうでなければFalseを返します。

以下はその使用例です。

import calendar
# 2024年が閏年かどうかを判定
year = 2024
is_leap = calendar.isleap(year)
if is_leap:
    print(f"{year}年は閏年です。")
else:
    print(f"{year}年は閏年ではありません。")

このコードを実行すると、2024年が閏年であることが表示されます。

出力結果は以下のようになります。

2024年は閏年です。

calendar.leapdays()で閏年の数をカウント

calendar.leapdays(year1, year2)関数を使用すると、指定した範囲内の閏年の数をカウントできます。

この関数は、開始年year1から終了年year2の間にある閏年の数を返します。

以下はその使用例です。

import calendar
# 2000年から2023年までの閏年の数をカウント
start_year = 2000
end_year = 2023
leap_years_count = calendar.leapdays(start_year, end_year)
print(f"{start_year}年から{end_year}年までの閏年の数は{leap_years_count}です。")

このコードを実行すると、2000年から2023年までの閏年の数が表示されます。

出力結果は以下のようになります。

2000年から2023年までの閏年の数は6です。

このように、calendarモジュールを使用することで、閏年の判定や閏年の数を簡単にカウントすることができます。

これにより、日付に関する処理をより正確に行うことが可能になります。

週に関する操作

calendarモジュールでは、週に関連する操作を行うための便利な関数が用意されています。

ここでは、週の開始曜日を取得したり設定したり、曜日の短縮名を取得する方法について解説します。

calendar.firstweekday()で週の開始曜日を取得

calendar.firstweekday()関数を使用すると、現在設定されている週の開始曜日を取得できます。

この関数は、0から6の整数を返し、0が月曜日、6が日曜日を表します。

以下はその使用例です。

import calendar
# 現在の週の開始曜日を取得
first_weekday = calendar.firstweekday()
print(f"現在の週の開始曜日は、{first_weekday}です。")

このコードを実行すると、現在の週の開始曜日が整数で表示されます。

出力結果は以下のようになります。

現在の週の開始曜日は、0です。

(ここで、0は月曜日を表します。)

calendar.setfirstweekday()で週の開始曜日を設定

calendar.setfirstweekday(weekday)関数を使用すると、週の開始曜日を設定できます。

曜日は整数で指定し、0が月曜日、6が日曜日です。

以下はその使用例です。

import calendar
# 週の開始曜日を日曜日に変更
calendar.setfirstweekday(calendar.SUNDAY)
# 現在の週の開始曜日を取得
first_weekday = calendar.firstweekday()
print(f"週の開始曜日を日曜日に設定しました。現在の開始曜日は、{first_weekday}です。")

このコードを実行すると、週の開始曜日が日曜日に設定されたことが表示されます。

出力結果は以下のようになります。

週の開始曜日を日曜日に設定しました。現在の開始曜日は、6です。

(ここで、6は日曜日を表します。)

calendar.weekheader()で曜日の短縮名を取得

calendar.weekheader(width)関数を使用すると、曜日の短縮名を取得できます。

width引数で短縮名の幅を指定することができ、指定した幅に合わせて曜日名が整形されます。

以下はその使用例です。

import calendar
# 曜日の短縮名を取得(幅を3に設定)
week_header = calendar.weekheader(3)
print(f"曜日の短縮名は、{week_header}です。")

このコードを実行すると、曜日の短縮名が表示されます。

出力結果は以下のようになります。

曜日の短縮名は、Mon Tue Wed Thu Fri Sat Sunです。

このように、calendarモジュールを使用することで、週に関する操作を簡単に行うことができます。

これにより、カレンダー関連の処理をより柔軟に扱うことが可能になります。

HTML形式のカレンダー

calendarモジュールでは、HTML形式のカレンダーを生成するためのHTMLCalendarクラスが用意されています。

このクラスを使用することで、ウェブページに埋め込むことができるカレンダーを簡単に作成できます。

ここでは、HTMLCalendarクラスの使い方や、月単位および年単位のHTMLカレンダーを生成する方法について解説します。

calendar.HTMLCalendarクラスの使い方

HTMLCalendarクラスは、HTML形式のカレンダーを生成するためのクラスです。

インスタンスを作成することで、さまざまなメソッドを使用してカレンダーを生成できます。

以下はその使用例です。

import calendar
# HTMLCalendarのインスタンスを作成
html_calendar = calendar.HTMLCalendar()
# HTML形式のカレンダーを表示
print(html_calendar.formatmonth(2023, 3))

このコードを実行すると、2023年3月のHTML形式のカレンダーが生成されます。

出力結果は以下のようになります

<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">March 2023</th></tr>
<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
<tr><td class="noday"> </td><td class="noday"> </td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td><td class="sat">4</td><td class="sun">5</td></tr>
<tr><td class="mon">6</td><td class="tue">7</td><td class="wed">8</td><td class="thu">9</td><td class="fri">10</td><td class="sat">11</td><td class="sun">12</td></tr>
<tr><td class="mon">13</td><td class="tue">14</td><td class="wed">15</td><td class="thu">16</td><td class="fri">17</td><td class="sat">18</td><td class="sun">19</td></tr>
<tr><td class="mon">20</td><td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td><td class="sat">25</td><td class="sun">26</td></tr>
<tr><td class="mon">27</td><td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="fri">31</td><td class="noday"> </td><td class="noday"> </td></tr>
</table>

レンダリングしたもの

March 2023
MonTueWedThuFriSatSun
  12345
6789101112
13141516171819
20212223242526
2728293031  

formatmonth()で月単位のHTMLカレンダーを生成

formatmonth(year, month)メソッドを使用すると、指定した年と月のHTML形式のカレンダーを生成できます。

以下はその使用例です。

import calendar
# HTMLCalendarのインスタンスを作成
html_calendar = calendar.HTMLCalendar()
# 2023年3月のHTMLカレンダーを生成
year = 2023
month = 3
html_output = html_calendar.formatmonth(year, month)
print(html_output)

このコードを実行すると、2023年3月のHTML形式のカレンダーが生成され、出力されます。

出力結果は上記の例と同様です。

formatyear()で年単位のHTMLカレンダーを生成

formatyear(year)メソッドを使用すると、指定した年のHTML形式のカレンダーを生成できます。

以下はその使用例です。

import calendar
# HTMLCalendarのインスタンスを作成
html_calendar = calendar.HTMLCalendar()
# 2023年のHTMLカレンダーを生成
year = 2023
html_output = html_calendar.formatyear(year)
print(html_output)

このコードを実行すると、2023年の全体のHTML形式のカレンダーが生成されます。

出力結果は、各月のカレンダーがテーブル形式で表示されるHTMLコードになります。

このように、calendarモジュールのHTMLCalendarクラスを使用することで、ウェブページに埋め込むことができるHTML形式のカレンダーを簡単に生成することができます。

これにより、カレンダーを視覚的に表示することが可能になります。

応用例

calendarモジュールを活用することで、さまざまな応用が可能です。

ここでは、特定の曜日に基づく日付のリスト作成、祝日やイベントのカレンダー作成、カレンダーをPDFや画像に変換して出力する方法について解説します。

特定の曜日に基づく日付のリストを作成

特定の曜日(例えば、毎週月曜日)に基づいて、指定した期間内の日付のリストを作成することができます。

以下はその使用例です。

import calendar
from datetime import datetime, timedelta
# 2023年1月1日から2023年12月31日までの月曜日の日付をリスト作成
start_date = datetime(2023, 1, 1)
end_date = datetime(2023, 12, 31)
monday_dates = []
# 1日ずつ日付を進めて、月曜日の日付をリストに追加
current_date = start_date
while current_date <= end_date:
    if calendar.weekday(current_date.year, current_date.month, current_date.day) == 0:  # 0は月曜日
        monday_dates.append(current_date.strftime("%Y-%m-%d"))
    current_date += timedelta(days=1)
print("2023年の月曜日の日付リスト:")
print(monday_dates)

このコードを実行すると、2023年のすべての月曜日の日付がリストとして表示されます。

祝日やイベントのカレンダーを作成

祝日や特定のイベントをカレンダーに追加することも可能です。

以下は、特定の祝日をカレンダーに表示する方法の例です。

import calendar
# 祝日を辞書で定義
holidays = {
    "2023-01-01": "元日",
    "2023-02-11": "建国記念の日",
    "2023-04-29": "昭和の日",
    "2023-05-03": "憲法記念日",
    "2023-05-04": "みどりの日",
    "2023-05-05": "こどもの日",
}
# 2023年のカレンダーを生成
year = 2023
html_calendar = calendar.HTMLCalendar()
# HTML形式のカレンダーを生成
html_output = html_calendar.formatyear(year)
# 祝日をカレンダーに追加
for date, name in holidays.items():
    html_output = html_output.replace(date, f"<span style='color:red;'>{date} ({name})</span>")
print(html_output)

このコードを実行すると、2023年のカレンダーが生成され、祝日が赤色で表示されます。

カレンダーをPDFや画像に変換して出力

カレンダーをPDFや画像に変換するには、matplotlibreportlabなどの外部ライブラリを使用することが一般的です。

以下は、matplotlibを使用してカレンダーを画像として保存する方法の例です。

import matplotlib.pyplot as plt
import calendar
# 2023年3月のカレンダーを生成
year = 2023
month = 3
cal = calendar.monthcalendar(year, month)
# カレンダーをプロット
fig, ax = plt.subplots()
ax.set_title(f"{year}年{month}月のカレンダー")
ax.axis('off')
# 曜日を表示
days = ['月', '火', '水', '木', '金', '土', '日']
ax.table(cellText=cal, colLabels=days, cellLoc='center', loc='center')
# 画像として保存
plt.savefig("calendar_march_2023.png", bbox_inches='tight')
plt.show()

このコードを実行すると、2023年3月のカレンダーが画像として保存されます。

matplotlibを使用することで、カレンダーを視覚的に表現し、さまざまな形式で出力することが可能になります。

これらの応用例を通じて、calendarモジュールの機能を活用し、実用的なカレンダー関連の処理を行うことができます。

まとめ

この記事では、Pythonのcalendarモジュールを使用してカレンダーの表示や日付の操作、閏年の判定、週に関する操作、HTML形式のカレンダーの生成、さらには応用例について詳しく解説しました。

これにより、カレンダー関連の処理を効率的に行うための方法を学ぶことができました。

今後は、実際のプロジェクトや日常のタスクにcalendarモジュールを活用し、より便利なプログラミングを試みてみてください。

関連記事

Back to top button