【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-businesscalendar
や bizdays
などのサードパーティライブラリを使用して、カスタムビジネス月を定義するオフセットを作成することもできます。
これらのライブラリは、CustomBusinessMonthBegin
オフセットよりも多くの機能を提供する場合があります。
pandas.tseries.offsets.CustomBusinessMonthBegin
オフセットは、カスタムビジネス月を定義するための便利なツールですが、状況によっては上記のような代替方法の方が適切な場合もあります。