pandasの年末判定をマスター!BusinessMonthEnd.is_year_endのすべて


pandas.tseries.offsets.BusinessMonthEnd.is_year_end は、指定された日付が年末のビジネスデーかどうかを判定する関数です。

引数

  • ts: 時系列データポイント

戻り値

  • False: 指定された日付が年末のビジネスデーではない場合
  • True: 指定された日付が年末のビジネスデーの場合

詳細

BusinessMonthEnd オフセットは、月末のビジネスデーを表します。is_year_end メソッドは、このオフセットが年末に該当するかどうかを判定します。

年末は一般的に12月31日ですが、閏年には2月29日となります。is_year_end メソッドは、これらの日付を考慮して判定を行います。

import pandas as pd

# 2023年の12月31日
ts = pd.Timestamp('2023-12-31')

# True: 2023年12月31日は年末のビジネスデー
print(pd.offsets.BusinessMonthEnd().is_year_end(ts))

# 2024年の2月29日
ts = pd.Timestamp('2024-02-29')

# True: 2024年は閏年なので、2月29日は年末のビジネスデー
print(pd.offsets.BusinessMonthEnd().is_year_end(ts))

# 2024年の3月1日
ts = pd.Timestamp('2024-03-01')

# False: 2024年3月1日は年末ではない
print(pd.offsets.BusinessMonthEnd().is_year_end(ts))
  • is_year_end メソッドは、時間情報 (時刻) を考慮しません。判定対象は日付のみとなります。
  • is_year_end メソッドは、BusinessDay カレンダーに基づいて判定を行います。デフォルトのカレンダーは米国市場に基づいていますが、weekmaskholidays オプションでカスタマイズできます。
  • is_quarter_end: 指定された日付が四半期の最後のビジネスデーかどうかを判定します。
  • is_quarter_start: 指定された日付が四半期の最初のビジネスデーかどうかを判定します。
  • is_month_end: 指定された日付が月の最後のビジネスデーかどうかを判定します。
  • is_month_start: 指定された日付が月の最初のビジネスデーかどうかを判定します。


例1:年末かどうかを判定する

import pandas as pd

# 2023年から2025年までのデータを作成
dates = pd.date_range('2023-01-01', '2025-12-31')

# 各日付が年末かどうかを判定
is_year_end = pd.Series(dates, index=dates).apply(pd.offsets.BusinessMonthEnd().is_year_end)

# 結果を表示
print(is_year_end)

出力

2023-01-01    False
2023-02-01    False
2023-03-01    False
...
2024-12-31    True
2025-01-01    False
2025-02-01    False
Name: is_year_end, dtype: bool

例2:年末のみに処理を行う

import pandas as pd

# 2023年から2025年までのデータを作成
dates = pd.date_range('2023-01-01', '2025-12-31')

# 年末のみ処理
for date in dates[dates.apply(pd.offsets.BusinessMonthEnd().is_year_end)]:
    print(f"{date}: 年末処理を実行")

出力

2023-12-31: 年末処理を実行
2024-12-31: 年末処理を実行

例3:年末のデータのみ抽出する

import pandas as pd

# 2023年から2025年までのデータを作成
dates = pd.date_range('2023-01-01', '2025-12-31')

# 年末のデータのみ抽出
year_end_dates = dates[dates.apply(pd.offsets.BusinessMonthEnd().is_year_end)]

# 抽出結果を表示
print(year_end_dates)

出力

DatetimeIndex([Timestamp('2023-12-31'), Timestamp('2024-12-31')], dtype='datetime64[ns]', freq='D')

これらの例は、pandas.tseries.offsets.BusinessMonthEnd.is_year_end メソッドを様々な状況で使用する方法を示しています。

  • 処理対象のデータ量が多い場合は、apply メソッドよりもベクトル化処理の方が効率的に実行できます。


以下に、いくつかの代替方法とそのメリット・デメリットを紹介します。

手動で判定する

import pandas as pd

def is_year_end(ts):
    """
    指定された日付が年末のビジネスデーかどうかを判定する

    Args:
        ts (pd.Timestamp): 時系列データポイント

    Returns:
        bool: True: 年末のビジネスデー, False: それ以外
    """
    if ts.month == 12 and ts.day == 31:
        # 12月31日
        if pd.offsets.BusinessDay().is_business_day(ts):
            return True
    elif ts.is_leap_year() and ts.month == 2 and ts.day == 29:
        # 閏年の2月29日
        if pd.offsets.BusinessDay().is_business_day(ts):
            return True
    return False

# 2023年の12月31日
ts = pd.Timestamp('2023-12-31')

# True: 2023年12月31日は年末のビジネスデー
print(is_year_end(ts))

メリット

  • 処理速度が速い: 比較的シンプルなコード
  • 柔軟性が高い: 独自の判定ロジックを実装できる

デメリット

  • テストが必要
  • 読みづらくなる
  • コードが冗長になる

month と day を比較する

import pandas as pd

def is_year_end(ts):
    """
    指定された日付が年末かどうかを判定する

    Args:
        ts (pd.Timestamp): 時系列データポイント

    Returns:
        bool: True: 年末, False: それ以外
    """
    return (ts.month == 12) & (ts.day == 31)

# 2023年の12月31日
ts = pd.Timestamp('2023-12-31')

# True: 2023年12月31日は年末
print(is_year_end(ts))

メリット

  • シンプルでわかりやすいコード

デメリット

  • BusinessDay カレンダーに基づいた判定ではない
  • 閏年の2月29日は考慮されない

DataFrame.apply を使用する

import pandas as pd

def is_year_end(df):
    """
    DataFrameの各行に対して判定を行う

    Args:
        df (pd.DataFrame): データフレーム

    Returns:
        pd.Series: 各行の判定結果
    """
    return df['date'].apply(lambda x: x.month == 12 and x.day == 31)

# データフレームを作成
df = pd.DataFrame({'date': ['2023-12-31', '2024-01-01', '2024-02-29', '2024-03-01']})

# 各行の判定結果
is_year_end_series = is_year_end(df)

# 結果を表示
print(is_year_end_series)

メリット

  • ベクトル化処理が可能

デメリット

  • コードが冗長になる
  • 処理速度が遅くなる場合がある
import pandas as pd
import numpy as np

def is_year_end(dates):
    """
    Numpy配列の各要素に対して判定を行う

    Args:
        dates (np.ndarray): 日付のNumpy配列

    Returns:
        np.ndarray: 各要素の判定結果
    """
    return (dates[:, 1] == 12) & (dates[:, 2] == 31)

# Numpy配列を作成
dates = np.array(['2023-12-31', '2024-01-01', '2024-02-29', '2024-03-01'],