Pythonでカレンダー操作を簡単にする!calendar.monthrange() 関数徹底解説


関数の引数と返り値

monthrange() 関数は、以下の2つの引数を受け取ります。

  • month: 対象となる月の整数値 (1~12)
  • year: 対象となる年の整数値

関数は、以下のタプルを返します。

  • (start_day, num_days):
    • start_day: 1日の曜日 (月曜=0、日曜=6)
    • num_days: その月の末日までの日数

データ型

  • 返り値:
    • start_day: 整数型 (int)
    • num_days: 整数型 (int)
  • month: 整数型 (int)
  • year: 整数型 (int)
import calendar

# 2024年1月の情報取得
year = 2024
month = 1

# monthrange() 関数を実行
result = calendar.monthrange(year, month)

# 結果の表示
print(f"{year}{month}月の情報:")
print(f"開始曜日: {result[0]}")  # 月曜=0、日曜=6
print(f"日数: {result[1]}")

この例では、2024年1月の情報を出力します。結果は以下のような形式になります。

2024年1月の情報:
開始曜日: 2
日数: 31

2024年1月1日は水曜日 (2) であり、31日間あることが確認できます。



特定の月の情報取得

import calendar

# 2024年3月の情報取得
year = 2024
month = 3

result = calendar.monthrange(year, month)

print(f"{year}{month}月の情報:")
print(f"開始曜日: {result[0]}")
print(f"日数: {result[1]}")

特定の年のすべての月の情報取得

import calendar

# 2024年のすべての月の情報取得
year = 2024

for month in range(1, 13):
    result = calendar.monthrange(year, month)
    print(f"{year}{month}月の情報:")
    print(f"開始曜日: {result[0]}")
    print(f"日数: {result[1]}")
    print("----")
import calendar

# 2023年1月から2024年12月までのすべての月の情報取得
start_year = 2023
end_year = 2024

for year in range(start_year, end_year + 1):
    for month in range(1, 13):
        result = calendar.monthrange(year, month)
        print(f"{year}{month}月の情報:")
        print(f"開始曜日: {result[0]}")
        print(f"日数: {result[1]}")
        print("----")

これらのコードは、calendar.monthrange() 関数を使用して、特定の月や期間の情報を取得する方法を示しています。実際の用途に合わせて、コードをカスタマイズして使用することができます。

  • 曜日や月名の取得には、calendar モジュールの他の関数を利用することができます。
  • 上記のコードは、Python 3.x で動作確認しています。


datetime モジュールを使用する

datetime モジュールは、日付と時刻を処理するための様々な機能を提供します。このモジュールを使用して、以下の方法で開始曜日と末日までの日数を取得できます。

import datetime

# 対象となる年と月を指定
year = 2024
month = 1

# 開始日と終了日を作成
start_date = datetime.date(year, month, 1)
end_date = start_date + datetime.timedelta(days=calendar.monthrange(year, month)[1] - 1)

# 開始曜日と日数を取得
start_day = start_date.weekday()
num_days = (end_date - start_date).days + 1

# 結果の表示
print(f"{year}{month}月の情報:")
print(f"開始曜日: {start_day}")  # 月曜=0、日曜=6
print(f"日数: {num_days}")

この方法は、calendar.monthrange() 関数よりも柔軟性があり、開始日や終了日に対して様々な操作を行うことができます。

手動で計算する

シンプルな場合や、パフォーマンスが重要な場合は、以下の方法で手動で計算することもできます。

def monthrange(year, month):
    """指定された年と月の開始曜日と末日までの日数を返す関数"""
    start_day = (datetime.date(year, month, 1) - datetime.date(1, 1, 1)).weekday()
    num_days = calendar.monthlen(year, month)
    return start_day, num_days

# 対象となる年と月を指定
year = 2024
month = 1

# 開始曜日と日数を取得
start_day, num_days = monthrange(year, month)

# 結果の表示
print(f"{year}{month}月の情報:")
print(f"開始曜日: {start_day}")  # 月曜=0、日曜=6
print(f"日数: {num_days}")

この方法は、理解しやすく、シンプルですが、calendar モジュールを使用する方法よりもコード量が多くなります。

dateutilarrow などのライブラリは、calendar モジュールよりも高度な日付処理機能を提供しており、これらのライブラリを使用して calendar.monthrange() 関数と同等の機能を実現することができます。

どの方法が適切かは、状況によって異なります。

  • より高度な日付処理機能が必要であれば、dateutilarrow などのライブラリを使用することを検討しましょう。
  • 柔軟性やパフォーマンスが重要であれば、datetime モジュールを使用するか、手動で計算する方法を検討しましょう。
  • シンプルで分かりやすい方法が必要であれば、calendar.monthrange() 関数を使用するのがおすすめです。