Pythonでカレンダー生成:calendar.prmonth() 関数で高度なフォーマットのカレンダーを作成


calendar.prmonth(year, month, [width], [leapyear])

引数

  • leapyear
    (オプション) 閏年かどうかを指定します。True の場合、閏年としてカレンダーを出力します。デフォルトは False です。
  • width
    (オプション) 出力されるカレンダーの列幅を整数型で指定します。デフォルトは 20 です。
  • month
    対象となる月を整数型で指定します。1 から 12 の範囲で指定する必要があります。
  • year
    対象となる年を整数型で指定します。

戻り値

なし。指定した年と月のカレンダーを標準出力にテキスト形式で出力します。

動作例

import calendar

calendar.prmonth(2024, 7)

上記のコードを実行すると、2024年7月のカレンダーが以下のように出力されます。

    July 2024
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

解説

  • 変換された文字列は、標準出力に出力されます。
  • 各週の日付リストは、format() メソッドを使用して、指定された形式で文字列に変換できます。
  • カレンダーオブジェクトは、monthdays() メソッドを使用して、その月の各週の日付リストを取得できます。
  • calendar.prmonth() 関数は、引数で指定された年と月のカレンダー情報を含むカレンダーオブジェクトを作成します。

calendar.prmonth() 関数は、以下の Data Types を利用しています。

  • str
    カレンダー文字列を格納するために使用されます。
  • int
    年、月、列幅、閏年の有無を指定するために使用されます。

calendar.prmonth() 関数は、Python でカレンダーを簡単に操作できる便利なツールです。Data Types を理解することで、この関数の動作をより深く理解することができます。

  • より複雑なカレンダー機能が必要な場合は、calendar.TextCalendar クラスなどの他のクラスを使用することができます。
  • calendar.prmonth() 関数は、HTML 形式のカレンダーを出力するには使用できません。HTML 形式のカレンダーを出力したい場合は、calendar.formatmonth() 関数を使用する必要があります。


特定の年と月のカレンダーを出力

import calendar

year = 2024
month = 7

calendar.prmonth(year, month)

カレンダの列幅を変更

import calendar

year = 2024
month = 7
width = 30

calendar.prmonth(year, month, width)

このコードは、2024年7月のカレンダーを、列幅30で出力します。

閏年かどうかを判定してカレンダーを出力

import calendar

year = 2024
month = 2
is_leap_year = calendar.isleap(year)

calendar.prmonth(year, month, leapyear=is_leap_year)

このコードは、2024年2月のカレンダーを、閏年かどうかを判定して出力します。

import calendar

year = 2024
month = 7
target_day = 15

calendar.setfirstweekday(calendar.SUNDAY)
month_matrix = calendar.monthdays2(year, month)
for week in month_matrix:
    for day in week:
        if day == target_day:
            print(f"{day:2}", end=" ")
        else:
            print(f"{day:2}", end=" ")
    print()


calendar.month() 関数

  • コードがより柔軟かつ詳細な制御が可能になる一方で、calendar.prmonth() 関数のように簡単にカレンダーを出力することはできません。
  • 返却された文字列を自由にフォーマットしたり、他の処理に使用したりすることができます。
  • 主な違いは、calendar.month() 関数はカレンダーを標準出力に出力せず、返却する点です。
  • calendar.month() 関数は、calendar.prmonth() 関数と同様に、指定した年と月のカレンダー情報を文字列として返します。
import calendar

year = 2024
month = 7

calendar_str = calendar.month(year, month)
print(calendar_str)

HTML 形式のカレンダー

  • calendar.prmonth() 関数よりも視覚的に訴求力のあるカレンダーを作成することができますが、HTML と CSS に関する知識が必要となります。
  • 生成された HTML コードを Web ページに埋め込むことで、ブラウザ上でカレンダーを表示することができます。
  • calendar.formatmonth() 関数を使用して、HTML 形式のカレンダーを生成することができます。
import calendar

year = 2024
month = 7

html_calendar = calendar.formatmonth(year, month)
print(html_calendar)

サードライブラリ

  • 標準ライブラリの関数よりも柔軟性がありますが、追加のライブラリのインストールと使用方法を学ぶ必要があります。
  • 複雑なレイアウトや装飾を施したカレンダーを作成したい場合に有効です。
  • PrettyTabletabulate などのサードライブラリを使用して、より高度なフォーマットのカレンダーを作成することができます。
import prettytable as pt

year = 2024
month = 7

table = pt.Table()
table.title = f"{year}{month}月"

# カレンダヘッダーの作成
days = ["日", "月", "火", "水", "木", "金", "土"]
table.add_column("曜日", days)

# カレンダーデータの作成
month_matrix = calendar.monthdays2(year, month)
for week in month_matrix:
    table.add_row(week)

print(table)
  • 柔軟性と制御性に欠けますが、非常に簡潔なコードでカレンダーを出力することができます。
  • 必要な情報のみを含むシンプルなカレンダーを出力したい場合は、手動で文字列をフォーマットする方法もあります。
import calendar

year = 2024
month = 7

month_days = calendar.monthdays2(year, month)
first_weekday = calendar.firstweekday(year, month)

# カレンダーヘッダーの作成
days = ["日", "月", "火", "水", "木", "金", "土"]
print(f"      {year}{month}月")
print("-" * 20)
print(*days)

# カレンダーデータの作成
week_str = ""
for day in month_days:
    if day == 0:
        if week_str:
            print(week_str)
        week_str = ""
        continue

    week_str += f"{day:2} "

    if len(week_str) == 21:
        print(week_str)
        week_str = ""

if week_str:
    print(week_str)