【知らなきゃ損!】Pandasで年末判定を効率化!BYearBegin.is_year_endと代替方法の比較
pandas.tseries.offsets.BYearBegin.is_year_end
は、指定された日付が年末かどうかを判定する関数です。
使い方
import pandas as pd
# 年始の日付
dt = pd.Timestamp('2024-01-01')
# BYearBeginオブジェクトを作成
offset = pd.tseries.offsets.BYearBegin()
# 年末判定
is_year_end = offset.is_year_end(dt)
print(is_year_end) # False
出力結果
False
- 結果は
False
となり、2024年1月1日は年末ではないことが分かります。 is_year_end
メソッドを使用して、dt
が年末かどうかを判定します。BYearBegin
オブジェクトをoffset
に作成します。- 上記コードでは、2024年1月1日を
dt
に設定します。
- 他の日付オフセットクラスにも同様のメソッドが存在します。
is_year_end
メソッドは、単独で使用することができ、offset
オブジェクトは必須ではありません。
import pandas as pd
# 年を指定
year = 2023
# 年末の日付をリストに格納
year_end_dates = []
# 各月の末日をループ処理
for month in range(1, 13):
# 月末の日付を作成
month_end_date = pd.Timestamp(f'{year}-{month:02d}-31')
# BYearBeginオブジェクトを作成
offset = pd.tseries.offsets.BYearBegin()
# 年末判定
is_year_end = offset.is_year_end(month_end_date)
# 年末であればリストに追加
if is_year_end:
year_end_dates.append(month_end_date)
# 結果表示
print(year_end_dates)
出力結果
[Timestamp('2023-12-31 00:00:00'),]
解説
- 結果として、2023年12月31日のみがリストに格納されます。
- 年末であれば、
year_end_dates
リストに追加します。 - 各月の末日をループ処理し、
is_year_end
メソッドを使用して年末かどうかを判定します。 - 上記コードでは、2023年の年末を判定します。
例2:複数年の年末判定
import pandas as pd
# 開始年と終了年を指定
start_year = 2020
end_year = 2024
# 年末の日付を格納する辞書
year_end_dates_dict = {}
# 各年のループ処理
for year in range(start_year, end_year + 1):
# 年末の日付をリストに格納
year_end_dates = []
# 各月の末日をループ処理
for month in range(1, 13):
# 月末の日付を作成
month_end_date = pd.Timestamp(f'{year}-{month:02d}-31')
# BYearBeginオブジェクトを作成
offset = pd.tseries.offsets.BYearBegin()
# 年末判定
is_year_end = offset.is_year_end(month_end_date)
# 年末であればリストに追加
if is_year_end:
year_end_dates.append(month_end_date)
# 年末の日付リストを辞書に格納
year_end_dates_dict[year] = year_end_dates
# 結果表示
print(year_end_dates_dict)
出力結果
{2020: [Timestamp('2020-12-31 00:00:00')],
2021: [Timestamp('2021-12-31 00:00:00')],
2022: [Timestamp('2022-12-31 00:00:00')],
2023: [Timestamp('2023-12-31 00:00:00')],
2024: [Timestamp('2024-12-31 00:00:00')]}
解説
- 結果として、各年の年末日が辞書に格納されます。
- 年末であれば、
year_end_dates_dict
辞書に格納します。 - 各年の年末をループ処理し、
is_year_end
メソッドを使用して年末かどうかを判定します。 - 上記コードでは、2020年から2024年までの年末を判定します。
import pandas as pd
# 年を指定
year = 2023
# 特定の月の末日をリストに格納
month_end_dates = [
pd.Timestamp(f'{year}-{month:02d}-31') for month in [3, 6, 9, 12]
]
# 結果を格納するリスト
is_year_end_results = []
# 各月の末日をループ処理
for month_end_date in month_end_dates:
代替方法
- 月の末日と比較
import pandas as pd
# 年を指定
year = 2023
# 特定の月の末日をリストに格納
month_end_dates = [
pd.Timestamp(f'{year}-{month:02d}-31') for month in [3, 6, 9, 12]
]
# 結果を格納するリスト
is_year_end_results = []
# 各月の末日をループ処理
for month_end_date in month_end_dates:
# 次の月の1日を作成
next_month_1st = month_end_date + pd.DateOffset(days=1)
# 次の月の1日と一致すれば年末
is_year_end = month_end_date == next_month_1st - pd.tseries.offsets.BYearBegin()
# 結果をリストに追加
is_year_end_results.append(is_year_end)
# 結果表示
print(is_year_end_results)
出力結果
[True, False, False, True]
解説
- 結果として、リスト
is_year_end_results
には、それぞれの月の末日が年末かどうかが格納されます。 BYearBegin()
は、年始の日付を表すオフセットです。is_year_end
は、month_end_date
がnext_month_1st
-BYearBegin()
と一致すればTrue
となります。next_month_1st
は、month_end_date
に 1 日加算して作成されます。- 上記コードでは、
month_end_date
とnext_month_1st
を比較することで、年末かどうかを判定しています。
month属性の利用
import pandas as pd
# 年を指定
year = 2023
# 特定の月の末日をリストに格納
month_end_dates = [
pd.Timestamp(f'{year}-{month:02d}-31') for month in [3, 6, 9, 12]
]
# 結果を格納するリスト
is_year_end_results = []
# 各月の末日をループ処理
for month_end_date in month_end_dates:
# 月末の日付の月属性を取得
month = month_end_date.month
# 12月であれば年末
is_year_end = month == 12
# 結果をリストに追加
is_year_end_results.append(is_year_end)
# 結果表示
print(is_year_end_results)
出力結果
[True, False, False, True]
解説
- 結果として、リスト
is_year_end_results
には、それぞれの月の末日が年末かどうかが格納されます。 is_year_end
は、month
が 12 であればTrue
となります。- 上記コードでは、
month_end_date
のmonth
属性を使用して、12月かどうかを判定しています。
import pandas as pd
# 年を指定
year = 2023
# 特定の月の末日をリストに格納
month_end_dates = [
pd.Timestamp(f'{year}-{month:02d}-31') for month in [3, 6, 9, 12]
]
# 結果を格納するリスト
is_year_end_results = []
# 各月の末日をループ処理
for month_end_date in month_end_dates:
# 月末の日付のis_month_end属性を取得
is_month_end = month_end_date.is_month_end
# 年末であればis_month_endかつ12月
is_year_end = is_month_end and month_end_date.month == 12