閉じる

【Python】calendarモジュールでカレンダーを表示・カスタマイズする方法:HTML出力から日本語化まで解説

Pythonで日付管理やカレンダー表示機能を実装する際、標準ライブラリのcalendarモジュールは非常に強力なツールとなります。

このモジュールは単にカレンダーを表示するだけでなく、特定の日が何曜日であるかの判定や、月ごとの日数計算、さらにはWebアプリケーションで利用可能なHTML形式の出力まで幅広く対応しています。

2026年現在のモダンなPython開発においても、外部ライブラリを導入せずに軽量な処理を行いたい場合には、この標準モジュールの活用が推奨されます。

本記事では、基本的なテキスト形式のカレンダー表示から、日本語へのローカライズ、そしてWeb開発に役立つHTML形式の出力カスタマイズまでを詳しく紹介します。

Pythonのcalendarモジュールとは

Pythonのcalendarモジュールは、Unixのcalコマンドに近い機能をプログラムから制御できるように設計されたライブラリです。

日付や時刻を扱うdatetimeモジュールとは異なり、「月」や「年」といったカレンダー単位での処理に特化しているのが特徴です。

例えば、カレンダー形式の文字列を生成したり、特定の月のカレンダーを多次元リストとして取得したりすることが容易に行えます。

標準ライブラリであるため、追加のインストール作業なしですぐに利用できる点も大きなメリットです。

データ分析の際の日付マッピングや、ビジネスロジックにおける営業日の算出など、用途は多岐にわたります。

基本的なカレンダーの表示方法

まずは、最もシンプルなテキスト形式でカレンダーを表示する方法を見ていきましょう。

calendar.month()関数を使用することで、特定の年月のカレンダーを文字列として取得できます。

特定の月のカレンダーを表示する

以下のコードは、2026年5月のカレンダーを出力するもっとも基本的な例です。

Python
import calendar

# 2026年5月のカレンダーを文字列で取得
target_year = 2026
target_month = 5
cal_string = calendar.month(target_year, target_month)

# 結果を表示
print(cal_string)
実行結果
      May 2026
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

デフォルトでは、月曜日が週の始まり(Monday start)として出力されます。

出力結果は整形されたマルチライン文字列であるため、そのままprint()関数で表示するだけでカレンダーの形になります。

1年分のカレンダーを表示する

1ヶ月分ではなく、指定した年の全ての月を表示したい場合はcalendar.calendar()関数を利用します。

Python
import calendar

# 2026年の年間カレンダーを取得(引数w, l, cで余白の調整が可能)
year_cal = calendar.calendar(2026)

print(year_cal)

この関数は非常に長い文字列を返すため、コンソール出力時には画面幅に注意が必要ですが、ログファイルへの出力やドキュメント生成時には非常に便利です。

カレンダーのカスタマイズと設定変更

日本のビジネス環境や特定のアプリケーション要件によっては、週の開始曜日を変更したい場合が多くあります。

calendarモジュールでは、グローバルな設定変更やインスタンス化による制御が可能です。

週の開始曜日を日曜日に変更する

日本で一般的に普及している「日曜始まり」のカレンダーを作成するには、setfirstweekday()関数を使用します。

Python
import calendar

# 週の開始曜日を日曜日に設定
calendar.setfirstweekday(calendar.SUNDAY)

# 2026年5月のカレンダーを表示
print(calendar.month(2026, 5))
実行結果
      May 2026
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

calendar.SUNDAYのように定数を使用することで、可読性の高いコードを記述できます。

なお、週の開始曜日は0(月曜日)から6(日曜日)の数値で指定することも可能です。

カレンダーを日本語化(ローカライズ)する方法

デフォルトの表示では月名や曜日が英語表記になっていますが、これを日本語に変更するにはLocaleTextCalendarクラスを利用します。

この機能を利用するには、OS側に適切なロケール(ja_JPなど)がインストールされている必要があります。

Python
import calendar

# 日本語ロケールを指定してカレンダーオブジェクトを作成
# firstweekday=6 は日曜日始まりを意味します
ja_cal = calendar.LocaleTextCalendar(firstweekday=6, locale='ja_JP')

# 2026年5月のカレンダーを表示
print(ja_cal.formatmonth(2026, 5))
実行結果
      2月 2026
日 月 火 水 木 金 土
                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

「locale=’ja_JP.UTF-8’」など、環境によって指定方法が異なる場合があるため、動作しない場合は実行環境のロケール設定を確認してください。

このクラスを使用することで、曜日名が「月 火 水…」のように日本語で出力されるようになります。

HTML形式でカレンダーを出力する

Webアプリケーションのフロントエンドでカレンダーを表示したい場合、テキスト形式よりもHTML形式の方が扱いやすいでしょう。

calendar.HTMLCalendarクラスを使用すると、テーブルタグ(<table>)に基づいたHTML構造を自動生成できます。

HTMLCalendarの基本

以下のコードは、特定の月のHTMLソースコードを生成する例です。

Python
import calendar

# HTMLカレンダー生成クラスのインスタンス化
html_cal = calendar.HTMLCalendar(firstweekday=calendar.SUNDAY)

# 2026年5月のHTMLテーブルを取得
html_output = html_cal.formatmonth(2026, 5)

print(html_output)

出力されたHTMLには、tabletrthtdといった標準的なタグが含まれています。

各タグにはmonthsunmonなどのクラス名が自動的に付与されるため、CSSでのスタイリングが非常に容易です。

CSSクラスのカスタマイズ

特定の曜日に独自のCSSクラスを適用したい場合や、デザインを細かく調整したい場合は、クラスを継承してメソッドをオーバーライドします。

例えば、土曜日と日曜日に特別な色を付けたい場合などは、formatdayメソッドなどを書き換えることで対応可能です。

しかし、標準のクラスのままでも十分な情報が含まれているため、多くの場合、外部のCSSファイルで.sat { color: blue; }.sun { color: red; }と定義するだけで事足ります。

便利なユーティリティ機能

calendarモジュールには、表示以外にも日付計算に役立つ関数が多数用意されています。

これらを知っておくと、複雑な条件分岐を伴う日付処理を簡潔に記述できます。

月の初日の曜日と日数を取得する

monthrange()関数は、指定した年月の「その月の最初の日の曜日」と「その月の日数」をタプルで返します。

Python
import calendar

# 2026年2月の情報を取得
first_weekday, num_days = calendar.monthrange(2026, 2)

print(f"最初の曜日のインデックス: {first_weekday}")
print(f"月の日数: {num_days}")
実行結果
最初の曜日のインデックス: 6
月の日数: 28

この関数は、自作のカレンダーUIを作成する際や、月末の日付を自動判定したい場合に非常に重宝します。

特に、うるう年を考慮した処理を自前で実装する必要がなくなるため、バグの混入を防ぐことができます。

うるう年の判定

特定の年がうるう年かどうかを判定するには、isleap()関数を使用します。

Python
import calendar

# 2026年がうるう年か判定
is_leap = calendar.isleap(2026)
print(f"2026年はうるう年ですか?: {is_leap}")

# 2028年がうるう年か判定
is_leap_2028 = calendar.isleap(2028)
print(f"2028年はうるう年ですか?: {is_leap_2028}")
実行結果
2026年はうるう年ですか?: False
2028年はうるう年ですか?: True

また、leapdays(y1, y2)関数を使うと、指定した期間内に含まれるうるう年の回数を算出することも可能です。

実戦的な応用:多次元リストとしての取得

プログラム内部でカレンダーデータを加工したい場合、文字列やHTMLよりも多次元リスト(行列)形式でデータを取得する方が効率的です。

monthcalendar()関数を使用すると、週ごとのリストが含まれた入れ子のリストを取得できます。

Python
import calendar

# 日曜日始まりに設定
cal = calendar.Calendar(firstweekday=calendar.SUNDAY)

# 2026年5月の行列を取得
month_matrix = cal.monthdayscalendar(2026, 5)

for week in month_matrix:
    print(week)
実行結果
[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は、その月に含まれない前月または翌月の日付を示しています。

このデータ構造を利用すれば、GUIライブラリ(TkinterやPyQt)やWebフレームワーク(DjangoやFlask)のテンプレートエンジンでループ処理を行い、独自のデザインでカレンダーを描画することが容易になります。

2026年のシステム開発におけるcalendarモジュールの役割

モダンなPython開発では、pandasなどのライブラリを使って日付データを処理することが一般的です。

しかし、小規模なスクリプトやサーバーレス環境(AWS Lambdaなど)では、ライブラリのサイズを最小限に抑えることが求められます。

そのような場面で、追加パッケージ不要のcalendarモジュールは、軽量かつ安定した動作を保証する重要なコンポーネントです。

また、ISO 8601規格に準拠した週番号の取得や計算など、実務で頻出する処理にもしっかり対応しています。

datetimezoneinfoモジュールと組み合わせて使用することで、タイムゾーンを考慮した高度なスケジュール管理システムの構築も可能です。

まとめ

Pythonのcalendarモジュールは、シンプルなテキスト出力から高度なHTML生成、日付計算までをカバーする非常に便利なライブラリです。

本記事では、基本的なmonth()関数の使い方や、日曜始まりへの変更方法、日本語化の手順について解説しました。

また、Web開発で即戦力となるHTMLCalendarや、ロジック構築に欠かせないmonthrange()などの活用法も紹介しました。

カレンダー機能は多くのアプリケーションで求められる汎用的な要素です。

まずは標準モジュールの機能を使いこなし、必要に応じて外部ライブラリと組み合わせることで、効率的でメンテナンス性の高いコードを実現してください。

今回学んだテクニックを活用して、ぜひ自身のプロジェクトに最適なカレンダー機能を実装してみましょう。

URLをコピーしました!