四半期ごとに売上を分析したい?pandasのQuarterBegin.rollbackでラクラク解決!

2024-07-03

pandas.tseries.offsets.QuarterBegin.rollback の詳細解説

pandas.tseries.offsets.QuarterBegin.rollback は、pandasライブラリで提供されるデータオフセット機能の一つで、指定された日付を前の四半期の開始日に戻すためのメソッドです。

用途

このメソッドは、以下の様な状況で役立ちます。

  • 四半期ごとのデータ分析を行う際に、分析対象となる日付を四半期の開始日に揃えたい場合
  • 特定の日付がどの四半期に属しているかを確認したい場合
  • 四半期ごとの指標の推移を可視化したい場合

使い方

QuarterBegin.rollback メソッドは、以下の様に使用します。

import pandas as pd

# 分析対象の日付
date = pd.Timestamp('2024-05-15')

# 四半期の開始日を取得
quarter_begin = date.offset(QuarterBegin())
quarter_begin_rolled_back = quarter_begin.rollback(date)

print(quarter_begin_rolled_back)

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

2024-03-01 00:00:00

これは、date が2024年第2四半期に属しているため、quarter_begin は2024年4月1日となり、quarter_begin.rollback によって2024年第2四半期の開始日である2024年3月1日に戻されていることを示します。

オプション引数

QuarterBegin.rollback メソッドには、以下のオプション引数を渡すことができます。

  • startingMonth: 四半期の開始月を指定します。デフォルトは3で、1月から始まる四半期を想定しています。
  • day_of_week: 四半期の開始曜日を指定します。デフォルトはNoneで、考慮されません。
# 四半期の開始月を1月に設定
quarter_begin = date.offset(QuarterBegin(startingMonth=1))
quarter_begin_rolled_back = quarter_begin.rollback(date)

print(quarter_begin_rolled_back)
2024-01-01 00:00:00

補足

  • QuarterBegin.rollback メソッドは、引数として渡された日付が四半期の開始日であるかどうかを確認しません。そのため、引数として渡された日付が四半期の開始日ではない場合、意図した結果が得られない可能性があります
  • 四半期の開始日は、地域や慣習によって異なる場合があります。そのため、startingMonth オプション引数を使用して、分析対象となる地域や慣習に合わせた四半期の開始月を設定する必要があります


    さまざまな日付に対する動作

    この例では、QuarterBegin.rollback メソッドをさまざまな日付に対して適用し、それぞれの結果を確認します。

    import pandas as pd
    
    dates = [
        pd.Timestamp('2024-01-15'),
        pd.Timestamp('2024-03-01'),
        pd.Timestamp('2024-05-15'),
        pd.Timestamp('2024-07-15'),
        pd.Timestamp('2024-10-15'),
        pd.Timestamp('2024-12-15'),
    ]
    
    for date in dates:
        quarter_begin = date.offset(QuarterBegin())
        quarter_begin_rolled_back = quarter_begin.rollback(date)
        print(f"日付: {date}")
        print(f"四半期の開始日: {quarter_begin}")
        print(f"前の四半期の開始日: {quarter_begin_rolled_back}")
        print("-" * 20)
    

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

    日付: 2024-01-15
    四半期の開始日: 2024-01-01 00:00:00
    前の四半期の開始日: 2023-10-01 00:00:00
    --------------------------------
    日付: 2024-03-01
    四半期の開始日: 2024-03-01 00:00:00
    前の四半期の開始日: 2024-02-01 00:00:00
    --------------------------------
    日付: 2024-05-15
    四半期の開始日: 2024-04-01 00:00:00
    前の四半期の開始日: 2024-01-01 00:00:00
    --------------------------------
    日付: 2024-07-15
    四半期の開始日: 2024-07-01 00:00:00
    前の四半期の開始日: 2024-04-01 00:00:00
    --------------------------------
    日付: 2024-10-15
    四半期の開始日: 2024-10-01 00:00:00
    前の四半期の開始日: 2024-07-01 00:00:00
    --------------------------------
    日付: 2024-12-15
    四半期の開始日: 2024-10-01 00:00:00
    前の四半期の開始日: 2024-07-01 00:00:00
    --------------------------------
    

    異なる四半期の開始月を指定

    この例では、startingMonth オプション引数を使用して、四半期の開始月を1月に設定し、QuarterBegin.rollback メソッドを適用します。

    import pandas as pd
    
    dates = [
        pd.Timestamp('2024-01-15'),
        pd.Timestamp('2024-03-01'),
        pd.Timestamp('2024-05-15'),
        pd.Timestamp('2024-07-15'),
        pd.Timestamp('2024-10-15'),
        pd.Timestamp('2024-12-15'),
    ]
    
    for date in dates:
        quarter_begin = date.offset(QuarterBegin(startingMonth=1))
        quarter_begin_rolled_back = quarter_begin.rollback(date)
        print(f"日付: {date}")
        print(f"四半期の開始日: {quarter_begin}")
        print(f"前の四半期の開始日: {quarter_begin_rolled_back}")
        print("-" * 20)
    
    日付: 202
    


    pandas.tseries.offsets.QuarterBegin.rollback の代替方法

    注意点

    • QuarterBegin.rollback メソッドは、引数として渡された日付が四半期の開始日であるかどうかを確認しません。そのため、引数として渡された日付が四半期の開始日ではない場合、意図した結果が得られない可能性があります
    • 四半期の開始日は、地域や慣習によって異なる場合があります。そのため、startingMonth オプション引数を使用して、分析対象となる地域や慣習に合わせた四半期の開始月を設定する必要があります

    代替方法

    以下の方法で、QuarterBegin.rollback メソッドと同等の機能を実現できます。

    floor 関数と QuarterEnd オフセット

    import pandas as pd
    
    def get_previous_quarter_start(date):
        # 四半期の終了日を取得
        quarter_end = date.offset(QuarterEnd())
        # 四半期の終了日から1日前の日付を計算
        previous_quarter_start = quarter_end - pd.DateOffset(days=1)
        return previous_quarter_start
    
    dates = [
        pd.Timestamp('2024-01-15'),
        pd.Timestamp('2024-03-01'),
        pd.Timestamp('2024-05-15'),
        pd.Timestamp('2024-07-15'),
        pd.Timestamp('2024-10-15'),
        pd.Timestamp('2024-12-15'),
    ]
    
    for date in dates:
        previous_quarter_start = get_previous_quarter_start(date)
        print(f"日付: {date}")
        print(f"前の四半期の開始日: {previous_quarter_start}")
        print("-" * 20)
    

    このコードを実行すると、QuarterBegin.rollback メソッドと同じ結果が得られます。

    resample 関数と fillna 関数

    import pandas as pd
    
    def get_previous_quarter_start(df, date_col):
        # 四半期ごとにグループ化
        df_resampled = df.resample('Q', on=date_col).fillna(method='ffill')
        # 前の四半期の開始日を取得
        previous_quarter_start = df_resampled[date_col].shift(1)
        return previous_quarter_start
    
    df = pd.DataFrame({
        'date': [
            pd.Timestamp('2024-01-15'),
            pd.Timestamp('2024-03-01'),
            pd.Timestamp('2024-05-15'),
            pd.Timestamp('2024-07-15'),
            pd.Timestamp('2024-10-15'),
            pd.Timestamp('2024-12-15'),
        ],
        'value': [10, 20, 30, 40, 50, 60]
    })
    
    previous_quarter_start = get_previous_quarter_start(df, 'date')
    
    print(previous_quarter_start)
    

    カスタム関数

    上記の代替方法に加えて、独自のロジックに基づいて前の四半期の開始日を取得するカスタム関数を作成することもできます。