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
カレンダーに基づいて判定を行います。デフォルトのカレンダーは米国市場に基づいていますが、weekmask
やholidays
オプションでカスタマイズできます。
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'],