Pythonで月の日数を取得する方法!初心者でもわかるcalendar.monthrangeの使い方
生徒
「Pythonで、ある月に何日あるのかを調べたいんですが、どうすればいいんですか?」
先生
「Pythonではcalendarモジュールのmonthrange()関数を使えば、簡単に特定の月の日数がわかりますよ。」
生徒
「2月はうるう年とかあるし、手で計算すると間違えそうです……」
先生
「そのとおり!だからこそcalendar.monthrange()を使うと安全で便利なんです。一緒に学んでみましょう!」
1. calendar.monthrange()とは?
Python(パイソン)で月の日数を調べるには、calendar(カレンダー)モジュールに用意されているmonthrange()という関数を使います。
この関数は、指定した年と月を入力すると、「その月の1日が何曜日か」「その月が何日あるか」の2つを返してくれます。
2. calendarモジュールをインポートしよう
まずはcalendarモジュールを使う準備をします。Pythonに最初から入っている標準モジュールなので、特別なインストールは不要です。
import calendar
この1行で、カレンダー機能を使う準備が整いました。
3. 実際に月の日数を取得してみよう
では、実際に2025年2月が何日あるかを調べてみましょう。うるう年ではないので、28日になるはずです。
import calendar
year = 2025
month = 2
weekday, days = calendar.monthrange(year, month)
print(f"{year}年{month}月は{days}日あります。")
実行結果は以下のようになります。
2025年2月は28日あります。
ここで、weekdayには「その月の1日が何曜日か」が0〜6の数字で入っています。(0が月曜日、6が日曜日)
4. うるう年でも正しく日数が出るの?
はい、monthrange()はうるう年(例:2024年や2028年など)も正しく判定してくれます。たとえば、2024年2月の場合を見てみましょう。
import calendar
year = 2024
month = 2
_, days = calendar.monthrange(year, month)
print(f"{year}年{month}月は{days}日あります。")
2024年2月は29日あります。
このように、特別な処理を自分で書かなくても、うるう年も自動的に判定してくれるので安心です。
5. 月初の曜日を使って応用しよう
monthrange()のもうひとつの戻り値「月初の曜日」も便利です。たとえば、カレンダーのように曜日を表示したいときに使えます。
曜日の数字は以下のように割り当てられています:
- 0:月曜日(Monday)
- 1:火曜日(Tuesday)
- 2:水曜日(Wednesday)
- 3:木曜日(Thursday)
- 4:金曜日(Friday)
- 5:土曜日(Saturday)
- 6:日曜日(Sunday)
たとえば、2025年2月1日は土曜日なので、「5」が返ってきます。
6. 月ごとの日数をすべて表示する例
ここでは、1月から12月まで、それぞれ何日あるのかをまとめて表示するサンプルです。
import calendar
year = 2025
for month in range(1, 13):
_, days = calendar.monthrange(year, month)
print(f"{year}年{month}月は{days}日です。")
2025年1月は31日です。
2025年2月は28日です。
...
2025年12月は31日です。
このように、for文(繰り返し処理)を使うことで、カレンダー情報を一気に取得できます。
7. ユーザーから年と月を入力して日数を表示しよう
ユーザーが入力した年と月に対して、日数を調べる簡単なプログラムです。
import calendar
year = int(input("年を入力してください(例:2025):"))
month = int(input("月を入力してください(例:2):"))
_, days = calendar.monthrange(year, month)
print(f"{year}年{month}月は{days}日あります。")
このように、パソコン初心者でも簡単に使えるように、入力機能と組み合わせれば便利なツールになります。
8. よくあるエラーと注意点
最後に、初心者の方が間違えやすいポイントを紹介します。
- 月の指定が1〜12以外になるとエラーになります
→ たとえば「13」や「0」などは存在しない月なので、ValueErrorが発生します。 - 文字列のままではなく、整数(int型)で渡すこと
→ 入力値はint()で変換してからmonthrange()に渡しましょう。 - 曜日の数字は0〜6であることを覚えておこう
→ 月曜が0、日曜が6という順番は少し直感と違うかもしれませんが慣れましょう。