Python を使用して月の最後の日を見つける

Jay Shaw 2023年10月10日
  1. Python でカレンダー ライブラリを使用して月の最後の日を見つける
  2. Python で DateTime モジュールを使用して月の最後の日を見つける
  3. 矢印ライブラリを使用して月の最後の日を見つける
  4. Pandas モジュールを使用して月の最後の日を見つける
  5. まとめ
Python を使用して月の最後の日を見つける

毎月の最終日を覚えて、それを確実に把握するのは難しい場合があります。 数行のコードで任意の年の任意の月の最終日を表示するコンピューター プログラムが必要だと考えたことはありますか?

この記事では、標準の Python ライブラリを使用して月の最終日を簡単に見つけることができる Python プログラムを作成する方法を説明します。 calendardatetime などの組み込みライブラリと、pandasarrow などのサードパーティ ライブラリを使用して、Python で月の最終日を見つけます。

Python でカレンダー ライブラリを使用して月の最後の日を見つける

このセクションでは、組み込みの Python ライブラリ calendar を使用して、月の最後の日を見つけます。

このプログラムは、calendar サブ関数 monthrange を使用します。これは、yearmonth の 2つのパラメーター引数を取り、(week_day_of_first_day, number_of_days) のキー ペア値を返します。

最初の値は月の最初の平日 (0 は月曜日、6 は日曜日) を示し、2 番目の値は月の最後の日を示します。

import calendar

last_day = calendar.monthrange(2000, 1)
print(last_day)

1 月は 31 日あり、2000 年の最初の日は土曜日でした。

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
(5, 31)

Process finished with exit code 0

閏年 を入力として与えて、プログラムが Python で月の最後の日を正しく検出するかどうかを確認してみましょう。

import calendar

last_day1 = calendar.monthrange(2000, 2)
print(last_day1)

last_day2 = calendar.monthrange(2004, 2)
print(last_day2)

それに応じて閏年が表示されます。

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
(1, 29)
(6, 29)

Process finished with exit code 0

Python で DateTime モジュールを使用して月の最後の日を見つける

datetime ライブラリは、Python で月の最後の日を見つけるために使用される組み込みライブラリでもあります。

毎月の最初の日から 1 日を引いて、その月の最後の日を見つける

このプログラムは、月と年が入力として提供される月の最終日を見つけます。

import datetime

year = 2001
month = 2

v = datetime.date(year + int(month / 12), (month % 12) + 1, 1) - datetime.timedelta(
    days=1
)

print(v)

コードを分解してみましょう:

最初の行は datetime ライブラリをインポートします。 年と月を入力する 2つの変数 yearmonth が作成されます。 サブ関数 datetime.date() は、パラメーター内の 3つの値を日付として受け取ります。

このプログラムは、月の初日から 1 日さかのぼると前月の末日になるというロジックを使用しています。 これにより、12 月を除くすべての月の最終日が得られ、12 月は前年の最終日になります。

プログラムは、次の行を使用してこの問題に対処するために、12 月の年に 1 を追加します。

datetime.date(year + int(month / 12))

同様に、その月が 12 月の場合、プログラムは month % 12 のモジュラスに 1 を追加します。

これにより、月が 1 に設定されます。これは、現在の年を変更せずに 12 と同じ日数になります。 最後に、datetime.timedelta(days=1) 関数を使用して、現在の日付から 1 日を減算します。

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2001-02-28

Process finished with exit code 0

datetime ライブラリを使用してこれを行う別の方法は、メソッドを作成し、メソッドから 2つの値を返すことです。1つは 12 月用で、もう 1つは残りの月用です。 以下のプログラムを確認してみましょう。

import datetime


def last_day_of_month(date):
    if date.month == 12:
        return date.replace(day=31)
    return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)


print(last_day_of_month(datetime.date(2022, 10, 25)))

メソッド last_day_of_month はパラメーター date で作成されます。 if ステートメント内では、date.month == 12 を使用して月が 12 月かどうかがチェックされます。

条件が真の場合、日付は date.replace(day=31) に置き換えられます。 それ以外の場合、date は、month=date.month + 1 をインクリメントすることによって初日と翌月に置き換えられ、そこから 1 日が減算され、日付が指定された月の最後の日付になります。

以下に例を示します。

return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)

最後に、日付 datetime.date() を渡してメソッドを呼び出し、出力します。 これは、前の例よりも簡単なソリューションを提供します。

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2022-10-31

Process finished with exit code 0

for ループを使用して配列に格納されたプリロードされた日付を使用して月の最後の日を見つける

datetime ライブラリを使用するもう 1つの例は、月の最後の日の配列を作成し、それをループで実行して、datetime ライブラリに無効な日付を除外させることです。

以下のコード例を参照してください。

from datetime import datetime


def find_last_day(year, month):
    end_days = [31, 30, 29, 28, 27]
    for i in end_days:
        try:
            date = datetime(year, month, i)
        except ValueError:
            continue
        else:
            return date.date()
    return None


print(find_last_day(2020, 2))

このプログラムは、メソッド find_last_day()yearmonth の 2つのパラメーターと共に使用します。 配列 end_days には、可能な最後の数日が保存されます。

end_days の要素数だけ実行される for ループが作成されます。 try ブロック内で、変数は datetime() サブ関数を使用して日付を格納します。

月と年の値はパラメータごとに設定され、日の値には i が格納されます。

except ブロック内では、ValueError の条件が指定され、変数 datei 値が無効な月の値として破棄されます。 次に、continue を使用してループを再実行します。

このメソッドは、有効な値が見つかった場合、else ブロック内で date を返します。 最後に、メソッドが他の値を返さないように、return None が使用されます。

プログラムは、指定された配列から day の適切な値を検索します。 12 月の場合、ループは 31 を見つけて値を返します。 11 月などの月は 30 しかないため、その日に返されます。

同様に、2 月 31 日と 30 日はあり得ないので、ループはそれらにまたがって実行されます。 指定された年がうるう年の場合、ループによって 29 が返されます。 それ以外の場合は、28 が返されます。

最後に、このメソッドは、2 月と 2020 年を渡すことによって呼び出されます。

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2020-02-29

Process finished with exit code 0

ご覧のとおり、2020 年 2 月はうるう年でした。

月の最後の日を見つけるために、暦年のすべての月の最後の日を印刷する

ライブラリ datetime を使用して、Python で暦年のすべての月の最後の日を見つけ、すべてを出力することもできます。 プログラムを見てみましょう。

import datetime


def month_end(date):

    next_month = date.replace(day=28) + datetime.timedelta(days=4)

    return next_month - datetime.timedelta(days=next_month.day)


for month in range(1, 13):
    print(month_end(datetime.date(2022, month, 1)))

コードを分解してみましょう:

パラメータ date を取るメソッド month_end が作成されます。 このメソッド内で、変数 next_monthdate を取り、date.replace(day=28) を使用して日を 28 に置き換えます。これは、毎月最低 28 日があるためです。

値が置き換えられた後、この値に 4 日が追加され、前月の日数に応じて date が翌月の 1 日または 2 日にシフトされます。

現在の日付が 2000, 3, 4 で、今月の日の値が 4 であるとします。 date からこの日の値を引くと、前月の最終日 - 2000, 2, 28 になります。 このロジックは、このプログラムで使用されています。

変数 next_month の日はそれ自体から減算され、次の構文を使用してメソッドから返されます。

return next_month - datetime.timedelta(days=next_month.day)

インスタンス month を使用して (1,13) の範囲でループを実行する for ループを作成しました。 ループ内では、datetime.date を渡すことによってメソッド month_end が呼び出され、メソッドに年と日が提供されます。

月は、メソッドに 12 か月を渡すために for ループ内で使用されるインスタンス month に置き換えられます。

for month in range(1, 13):
    print(month_end(datetime.date(2022, month, 1)))

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2022-01-31
2022-02-28
2022-03-31
2022-04-30
2022-05-31
2022-06-30
2022-07-31
2022-08-31
2022-09-30
2022-10-31
2022-11-30
2022-12-31

Process finished with exit code 0

出力に示されているのは、暦年のすべての最後の日です。

矢印ライブラリを使用して月の最後の日を見つける

これは、日付操作に使用できるサードパーティの Python ライブラリです。 Python で月の最後の日を見つけるために使用されます。

このプログラムは、Arrow サブ関数 utcnow() を使用して、現在の世界時を取得します。 ceil('month').date を使用して月の上限を見つけます。

import arrow

print(arrow.utcnow().ceil("month").date())

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2022-10-31

Process finished with exit code 0

このコードは、今月の最後の日付を示します。

Pandas モジュールを使用して月の最後の日を見つける

このセクションでは、サードパーティの Python ライブラリである Pandas を使用して、その月の最終日を見つけます。 ここでは、プログラムは datetimepandas の 2つのライブラリ パッケージをインポートします。

パラメータ date を受け取るメソッド check_month_end が作成されます。 このメソッドはパラメーター date を取り、date + pd.offsets.MonthEnd(0) を使用してその月の残りの日数を追加します。

以下はコード例です。

from datetime import datetime

import pandas as pd


def check_month_end(date):
    return date + pd.offsets.MonthEnd(0)


print(check_month_end(datetime(2005, 2, 6)))

print(check_month_end(datetime(2004, 2, 29)))

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
2005-02-28 00:00:00
2004-02-29 00:00:00

Process finished with exit code 0

出力は Pandas タイムスタンプ形式で、月の最終日が表示されます。

Pandas を使用して、ある日が月の最後の日かどうかを確認する

Pandas を使用して、特定の日付が月の最終日かどうかを確認できます。 以前のいくつかのプログラムとは異なり、このプログラムはユーザー入力を受け取り、指定された日が有効かどうかをチェックします。

プログラムは、パラメータ値を使用して、date + pd.offsets.MonthEnd(0) == date を使用して月末と一致するかどうかを確認します。 このメソッドは、呼び出されるとブール値を返します。

提供されているサンプル コードを参照してください。

from datetime import datetime

import pandas as pd


def check_month_end(date):
    return date + pd.offsets.MonthEnd(0) == date


print(check_month_end(datetime(1996, 5, 16)))
print(check_month_end(datetime(1996, 5, 31)))

出力:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
False
True

Process finished with exit code 0

まとめ

この記事では、datetimecalendar などの組み込みライブラリ、および arrowpandas などのサードパーティ ライブラリを使用して、Python で月の最終日を見つけるさまざまな方法を学びました。

関連記事 - Python DateTime