【知らなきゃ損!】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:


代替方法

  1. 月の末日と比較
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_datenext_month_1st - BYearBegin() と一致すれば True となります。
  • next_month_1st は、month_end_date に 1 日加算して作成されます。
  • 上記コードでは、month_end_datenext_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_datemonth 属性を使用して、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