Pandasでビジネス四半期の終わりを計算する:BQuarterEndオフセットの解説とサンプルコード


pandas.tseries.offsets.BQuarterEnd は、Pandasライブラリで提供されるビジネス・クォーター終端オフセットを表すクラスです。これは、各四半期の最後のビジネスデイ に移動するオフセットを定義します。

属性

BQuarterEnd オブジェクトには、以下の属性があります。

  • rule_code: オフセットのルールコード。
  • startingMonth: 開始月。1、2、3 のいずれかになります。デフォルトは 1 です。
  • normalize: True の場合、オフセットを標準化します。
  • n: オフセットの倍数。デフォルトは 1 です。

rule_code 属性

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

  • SM: 開始月。
  • N: オフセットの倍数。
  • -E: オフセットが末日であることを示します。
  • BQTR: オフセットがビジネス・クォーター終端オフセットであることを示します。

以下の例では、BQuarterEnd オブジェクトを作成し、その rule_code 属性の値を確認しています。

import pandas as pd

offset = pd.tseries.offsets.BQuarterEnd(n=2, startingMonth=3)
print(offset.rule_code)

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

BQTR-E2SM3

この出力は、以下のことを意味します。

  • 開始月は 3 月です。
  • オフセットの倍数は 2 です。
  • オフセットは末日です。
  • オフセットはビジネス・クォーター終端オフセットです。

使い方

BQuarterEnd オフセットは、以下の操作に使用できます。

  • 時系列データに対してオフセットを適用する
  • 特定の日付から次のビジネス・クォーター終端オフセットの日付を取得する

以下の例では、2023年1月1日から次のビジネス・クォーター終端オフセットの日付を取得しています。

import pandas as pd

start_date = pd.Timestamp('2023-01-01')
offset = pd.tseries.offsets.BQuarterEnd()
next_date = start_date + offset
print(next_date)
2023-03-31

この出力は、2023年1月1日から次のビジネス・クォーター終端オフセットの日付が2023年3月31日であることを示しています。

pandas.tseries.offsets.BQuarterEnd は、Pandasライブラリで提供されるビジネス・クォーター終端オフセットを表すクラスです。このクラスは、各四半期の最後のビジネスデイに移動するオフセットを定義します。rule_code 属性を使用して、オフセットのルールを確認することができます。



import pandas as pd

start_date = pd.Timestamp('2024-01-01')
offset = pd.tseries.offsets.BQuarterEnd()
next_date = start_date + offset
print(next_date)

出力

2024-03-31

例 2: 時系列データに対してオフセットを適用する

この例では、BQuarterEnd オフセットを使用して、時系列データの各行を次のビジネス・クォーター終端オフセットの日付に進めます。

import pandas as pd

data = {'date': ['2023-01-10', '2023-04-15', '2023-07-20', '2023-10-12', '2023-12-25']}
df = pd.DataFrame(data)

offset = pd.tseries.offsets.BQuarterEnd()
df['next_date'] = df['date'] + offset
print(df)

出力

          date        next_date
0  2023-01-10  2023-03-31
1  2023-04-15  2023-06-30
2  2023-07-20  2023-09-30
3  2023-10-12  2023-12-31
4  2023-12-25  2024-03-31
  • next_date: 時系列データの各行に次のビジネス・クォーター終端オフセットの日付を追加した列
  • df: Pandas DataFrame
  • data: 時系列データ
  • next_date: 次のビジネス・クォーター終端オフセットの日付
  • offset: BQuarterEnd オフセット
  • start_date: 開始日付


代替方法 1: relativedelta モジュールを使用する

relativedelta モジュールを使用して、BQuarterEnd オフセットと同等の機能を持つオフセットを作成することができます。

from relativedelta import relativedelta

offset = relativedelta(weekday=relativedelta.MO(1), nthweekday=-1)

このコードは、以下のオフセットを作成します。

  • これが月末でない場合は、その月の最後の月曜日
  • 毎月第 1 週の月曜日

このオフセットは、BQuarterEnd オフセットとほぼ同じ動作をします。ただし、BQuarterEnd オフセットよりも汎用性が高く、他の多くのオフセットと組み合わせることができます。

代替方法 2: カスタムオフセットを作成する

BQuarterEnd オフセットと完全に同じ動作をするカスタムオフセットを作成することもできます。

import pandas as pd


class BQuarterEndOffset(pd.tseries.offsets.Offset):

    def __init__(self, n=1, startingMonth=1):
        self.n = n
        self.startingMonth = startingMonth

    def __repr__(self):
        return f"BQuarterEnd(n={self.n}, startingMonth={self.startingMonth})"

    def apply(self, base):
        if isinstance(base, pd.Timestamp):
            return base + self.relativedelta()
        elif isinstance(base, pd.DateOffset):
            return base + self.relativedelta()
        elif isinstance(base, pd.Period):
            return base + self.relativedelta()
        else:
            raise TypeError(f"Unsupported type {type(base)}")

    def relativedelta(self):
        offset = relativedelta(weekday=relativedelta.MO(1), nthweekday=-1)
        offset += relativedelta(months=-(self.startingMonth - 1) % 3)
        offset *= self.n
        return offset

offset = BQuarterEndOffset(n=2, startingMonth=3)
print(offset)

このコードは、BQuarterEnd オフセットとほぼ同じ動作をするカスタムオフセットを作成します。このカスタムオフセットは、独自の属性やメソッドを追加したり、BQuarterEnd オフセットではできないような操作を実行したりするために使用することができます。

代替方法 3: クォーター末のルールを使用する

BQuarterEnd オフセットと完全に同じ動作はしませんが、クォーター末のルールを使用して、類似した結果を得ることができます。

import pandas as pd

offset = pd.tseries.offsets.qtr_end

start_date = pd.Timestamp('2023-01-01')
next_date = start_date + offset
print(next_date)
2023-03-31

この出力は、2023年1月1日から次のクォーター末の日付が2023年3月31日であることを示しています。

pandas.tseries.offsets.BQuarterEnd.rule_code には、いくつかの代替方法があります。

  • クォーター末のルールを使用する
  • カスタムオフセットを作成する
  • relativedelta モジュールを使用する

どの代替方法を使用するかは、ニーズや要件によって異なります。

  • カスタムオフセットを作成する場合は、そのオフセットが期待通りに動作することを確認するために十分なテストを行うことが重要です。
  • BQuarterEnd オフセットは、米国で使用されるビジネスデイに基づいています。他の国や地域で使用されるビジネスデイと一致しない場合があります。