Pythonで特定の年・月の日数を取得する方法(calendar.monthrangeの使い方)
生徒
「特定の年と月の『その月は何日あるか』をPythonで調べたいです。毎月の日数が違うので手で数えるのは大変です。」
先生
「Pythonにはcalendarという標準モジュールがあって、monthrange()を使うと簡単にその月の日数を取得できます。うるう年や月ごとの日数差も自動で処理してくれますよ。」
生徒
「インストールとか不要ですか?プログラミング初心者でも使えますか?」
先生
「標準ライブラリなので追加インストールは不要です。数行のコードで使えるので、初心者でもすぐに使えます。具体例を見てみましょう。」
1. monthrangeとは?基本の説明
calendar.monthrange(year, month) は、指定した年と月に対して二つの値を返します。戻り値はタプルで、最初の要素がその月の最初の曜日(0が月曜日)、二つ目の要素がその月の日数です。たとえば二月は平年なら二十八日、うるう年なら二十九日になりますが、monthrangeは自動で正しい日数を返してくれます。カレンダー処理や月次集計でとても役立つ基本関数です。
2. 基本的な使い方のサンプル
まずはシンプルなコードで、特定の年と月の日数を取り出す方法を確認します。コードは短くて分かりやすく、すぐに実行できます。
import calendar
year = 2024
month = 2
first_weekday, days_in_month = calendar.monthrange(year, month)
print(days_in_month)
上記の例では、days_in_monthにその月の日数が入ります。二つ目の要素だけを取り出して使うのが一般的です。
3. 今日の年と月を使って日数を取得する
ユーザーの現在の年月を使って日数を取得することも簡単です。これにより今月の日数を自動で得られます。日次処理や月次レポートに便利なテクニックです。
import datetime
import calendar
today = datetime.date.today()
year = today.year
month = today.month
_, days_in_month = calendar.monthrange(year, month)
print(f"{year}年{month}月は{days_in_month}日あります")
4. 任意の年月の月初と月末の日付を作る
取得した日数を使えば、その月の月初と月末のdateオブジェクトも簡単に作れます。これを使えば範囲検索や月ごとのデータ集計にそのまま使えます。
import datetime
import calendar
year = 2025
month = 4
first_day = datetime.date(year, month, 1)
last_day = datetime.date(year, month, calendar.monthrange(year, month)[1])
print(first_day, last_day)
この例のように、月末の日付を直接作ることで、データベース問い合わせや集計の期間指定が簡単になります。
5. うるう年や月による違いの扱い方(注意点)
2月の日数はうるう年によって変わりますが、monthrangeは年を指定して呼び出すため、正しい判定を自動で行います。手作業で条件を増やす必要がないため、ミスを減らせます。初心者がよくやりがちなミスは、「二月は常に二十八日と仮定してしまう」ことです。monthrangeを使えばそうしたバグを避けられます。
6. 実務での応用例:月次レポートや締め処理
実際の業務では、月末の売上集計や締め処理のためにその月の最終日を自動で求める必要があります。前述の方法で月末日を取得し、その日付までのデータを抽出すれば自動化が可能です。さらに、翌月の初日を計算して期間を設定することで、二重集計や集計漏れといった問題を防げます。
7. よくある疑問とトラブルシューティング
「monthrangeの返り値の順番を間違えて使ってしまう」「年と月の変数が整数でない」などがよくある問題です。返り値は必ず (first_weekday, days_in_month) の順であることを確認し、年と月は整数で与えるようにしましょう。ユーザー入力を受け取る場合は、int()で型変換を行ってからmonthrangeに渡すと安全です。