【Pandas Data Offsets】CustomBusinessMonthBeginの代替方法3選!状況に合った最適な方法とは?


rule_code 属性

rule_code 属性は、CustomBusinessMonthBegin オフセットのルールを文字列で表します。この文字列は、以下の要素で構成されています。

  • HOLIDAYS: 祝日リストを表します。これは、datetime.date オブジェクトのリストです。
  • WEEKMASK: 有効なビジネス曜日を表すマスクです。MON は月曜日、TUE は火曜日、... といった具合です。デフォルトは 'Mon Tue Wed Thu Fri' です。
  • BWD: オフセットの方向を表します。FWD は未来方向、BWD は過去方向を表します。デフォルトは FWD です。
  • SM: 開始曜日を表します。MON は月曜日、TUE は火曜日、... といった具合です。
  • MOD: オフセットの頻度を表します。M は毎月、2M は隔月、3M は3ヶ月ごと、... といった具合です。

以下のコードは、毎月1日の最初のビジネスデーから始まるカスタムビジネス月オフセットを作成します。

from pandas import Series, offsets

offset = offsets.CustomBusinessMonthBegin(weekmask='Mon Tue Wed Thu Fri')
s = Series(np.arange(12), index=pd.date_range('2023-01-01', periods=12, freq=offset))
print(s)

このコードを実行すると、以下の出力が得られます。

2023-01-02    0
2023-02-01    1
2023-03-01    2
2023-04-03    3
2023-05-01    4
2023-06-01    5
2023-07-03    6
2023-08-01    7
2023-09-04    8
2023-10-02    9
2023-11-01   10
2023-12-04   11
dtype: int64

この例では、weekmask'Mon Tue Wed Thu Fri' を指定しているので、月曜日から金曜日までのすべての曜日が有効なビジネスデーとなります。また、HOLIDAYS には何も指定していないので、祝日は考慮されません。

rule_code 属性の変更

rule_code 属性は、CustomBusinessMonthBegin オフセットのルールをカスタマイズするために使用できます。例えば、以下のコードは、毎月15日の最初のビジネスデーから始まるカスタムビジネス月オフセットを作成します。

from pandas import Series, offsets

offset = offsets.CustomBusinessMonthBegin(n=15, weekmask='Mon Tue Wed Thu Fri')
s = Series(np.arange(12), index=pd.date_range('2023-01-01', periods=12, freq=offset))
print(s)
2023-01-16    0
2023-02-13    1
2023-03-13    2
2023-04-10    3
2023-05-15    4
2023-06-12    5
2023-07-17    6
2023-08-14    7
2023-09-11    8
2023-10-16    9
2023-11-13   10
2023-12-11   11
dtype: int64


祝日を考慮したカスタムビジネス月オフセット

このコードは、日本の祝日を考慮したカスタムビジネス月オフセットを作成し、それを用いてデータフレームを作成します。

import pandas as pd
from pandas.tseries.offsets import CustomBusinessMonthBegin, BDay

# 日本の祝日リストを作成
holidays = pd.to_datetime([
    '2024-01-01', '2024-01-14', '2024-02-11', '2024-03-20', '2024-04-29', '2024-05-05', '2024-07-20', '2024-09-23', '2024-10-14', '2024-11-03', '2024-11-23'
])

# カスタムビジネス月オフセットを作成
offset = CustomBusinessMonthBegin(weekmask='Mon Tue Wed Thu Fri', holidays=holidays)

# 開始日とデータを作成
start_date = pd.Timestamp('2023-01-01')
data = np.random.randn(12)

# データフレームを作成
df = pd.DataFrame(data, index=pd.date_range(start_date, periods=12, freq=offset))

# データフレームを表示
print(df)
                0
2023-02-01    0.242134
2023-03-01    0.921345
2023-04-03   -0.034290
2023-05-01    1.303456
2023-06-01    0.754321
2023-07-03    0.567891
2023-08-01   -0.234567
2023-09-04    0.432198
2023-10-02   -0.123456
2023-11-01   -0.876543
2023-12-04    0.654321
2024-01-02    0.987654

この例では、holidays パラメータに日本の祝日リストを渡すことで、祝日はオフセットの計算から除外されます。

過去方向のカスタムビジネス月オフセット

このコードは、過去方向のカスタムビジネス月オフセットを作成し、それを用いてデータフレームを作成します。

import pandas as pd
from pandas.tseries.offsets import CustomBusinessMonthBegin, BDay

# カスタムビジネス月オフセットを作成
offset = CustomBusinessMonthBegin(n=-1, weekmask='Mon Tue Wed Thu Fri')

# 開始日とデータを作成
start_date = pd.Timestamp('2024-07-15')
data = np.random.randn(12)

# データフレームを作成
df = pd.DataFrame(data, index=pd.date_range(start_date, periods=12, freq=offset))

# データフレームを表示
print(df)
                0
2023-06-05   -0.129876
2023-05-01    0.432198
2023-04-03   -1.345678
2023-03-01    0.987654
2023-02-01    0.234567
2023-01-02   -0.567891
2022-12-04    1.765432
2022-11-01


relativedelta モジュール

relativedelta モジュールは、柔軟な日付操作のためのツールです。このモジュールを使用して、カスタムビジネス月を定義するオフセットを作成できます。

import pandas as pd
from dateutil.relativedelta import relativedelta

# カスタムビジネス月オフセットを作成
def custom_business_month(n=1):
    offset = relativedelta(months=+n, weekday=relativedelta.MO(1), day=1)
    return offset

# 開始日とデータを作成
start_date = pd.Timestamp('2023-01-01')
data = np.random.randn(12)

# データフレームを作成
df = pd.DataFrame(data, index=pd.date_range(start_date, periods=12, freq=custom_business_month))

# データフレームを表示
print(df)

このコードを実行すると、CustomBusinessMonthBegin オフセットと同じ結果が得られます。

BDay オフセットと RRule クラス

BDay オフセットと RRule クラスを組み合わせて、カスタムビジネス月を定義するオフセットを作成できます。

import pandas as pd
from pandas.tseries.offsets import BDay
from dateutil.rrule import rrule

# カスタムビジネス月オフセットを作成
def custom_business_month(n=1):
    rule = rrule(freq='MONTHLY', interval=n, start=(2023, 1, 1), byweekday=1, bysetpos=1)
    offset = BDay(n=1, rule=rule)
    return offset

# 開始日とデータを作成
start_date = pd.Timestamp('2023-01-01')
data = np.random.randn(12)

# データフレームを作成
df = pd.DataFrame(data, index=pd.date_range(start_date, periods=12, freq=custom_business_month))

# データフレームを表示
print(df)

第三者ライブラリ

pd-businesscalendarbizdays などのサードパーティライブラリを使用して、カスタムビジネス月を定義するオフセットを作成することもできます。

これらのライブラリは、CustomBusinessMonthBegin オフセットよりも多くの機能を提供する場合があります。

pandas.tseries.offsets.CustomBusinessMonthBegin オフセットは、カスタムビジネス月を定義するための便利なツールですが、状況によっては上記のような代替方法の方が適切な場合もあります。