【2024年最新版】Pandas BQuarterEnd.normalize の使い方と注意点:四半期末分析のベストプラクティス


pandas.tseries.offsets.BQuarterEnd.normalizeは、pandasライブラリで提供される「データオフセット」と呼ばれる機能の一つです。データオフセットは、時間軸上の日付を操作するための便利なツールであり、BQuarterEnd.normalizeは、四半期末の日付を調整するために使用されます。

BQuarterEndとは?

BQuarterEndは、四半期末の日付を表すオフセットです。例えば、2024年1月1日を基準にBQuarterEndを適用すると、2024年3月31日、2024年6月30日、2024年9月30日、2024年12月31日といった四半期末の日付が生成されます。

normalizeオプションとは?

normalizeオプションは、BQuarterEndで生成された日付を調整するために使用されます。具体的には、以下の2つの効果があります。

  • 夏時間適用
    夏時間適用期間中の日付を、夏時間なしの日付に変換します。
  • 日付を前日の深夜0時に丸める
    例えば、2024年3月31日 15:30をnormalizeすると、2024年3月31日 00:00になります。

具体的な使い方

BQuarterEnd.normalizeは以下の方法で使用できます。

import pandas as pd

# 基準日付
base_date = pd.Timestamp('2024-01-01')

# オフセット生成
offset = pd.tseries.offsets.BQuarterEnd(n=4, normalize=True)

# 基準日付にオフセットを適用
dates = base_date + offset

print(dates)

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

[Timestamp('2024-03-31 00:00:00'), Timestamp('2024-06-30 00:00:00'), Timestamp('2024-09-30 00:00:00'), Timestamp('2024-12-31 00:00:00')]
  • BQuarterEnd.normalizeは、単独で使用することも、他のオフセットと組み合わせて使用することもできます。
  • normalizeオプションは、デフォルトでFalseに設定されています。


特定の日付を四半期末に調整

import pandas as pd

# 調整対象の日付
target_date = pd.Timestamp('2024-02-15')

# オフセット生成
offset = pd.tseries.offsets.BQuarterEnd(normalize=True)

# 調整
adjusted_date = target_date + offset

print(adjusted_date)
Timestamp('2024-03-31 00:00:00')

2月15日は第1四半期に属していますが、BQuarterEnd.normalize によって、最も近い四半期末である3月31日に調整されます。

基準日付から特定の四半期末を生成

import pandas as pd

# 基準日付
base_date = pd.Timestamp('2023-12-31')

# オフセット生成
offset = pd.tseries.offsets.BQuarterEnd(n=2, normalize=True)

# 基準日付から特定の四半期末を生成
dates = base_date + offset

print(dates)
[Timestamp('2024-03-31 00:00:00'), Timestamp('2024-06-30 00:00:00')]

基準日付である2023年12月31日から、2つ先の四半期末である2024年3月31日と2024年6月30日が生成されます。

DataFrame に BQuarterEnd.normalize を適用

import pandas as pd

# データフレーム作成
df = pd.DataFrame({'date': ['2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01']})

# BQuarterEnd.normalize を列に適用
df['adjusted_date'] = df['date'] + pd.tseries.offsets.BQuarterEnd(normalize=True)

print(df)
          date        adjusted_date
0  2023-01-01 2023-03-31 00:00:00
1  2023-04-01 2023-06-30 00:00:00
2  2023-07-01 2023-09-30 00:00:00
3  2023-10-01 2023-12-31 00:00:00

'date'列の各日付に対して、BQuarterEnd.normalize を適用して 'adjusted_date' 列に格納しています。

夏時間適用期間中の日付を調整

import pandas as pd

# 基準日付 (夏時間適用期間中)
base_date = pd.Timestamp('2024-07-14')

# オフセット生成
offset = pd.tseries.offsets.BQuarterEnd(n=1, normalize=True)

# 基準日付から特定の四半期末を生成
dates = base_date + offset

print(dates)
Timestamp('2024-09-30 00:00:00')

2024年7月14日は夏時間適用期間中ですが、normalizeオプションによって夏時間なしの日付である2024年9月30日に調整されます。

  • 上記のコードはあくまで一例であり、状況に合わせて自由にカスタマイズできます。


pandas.Grouper を使用する

pandas.Grouper を使用して、四半期ごとにデータをグループ化し、グループ内の最後の行を取得することで、四半期末の日付を取得することができます。

import pandas as pd

# データフレーム作成
df = pd.DataFrame({'date': ['2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01'],
                   'value': [10, 20, 30, 40]})

# 四半期ごとにグループ化し、最後の行を取得
result = df.groupby(pd.Grouper(key='date', freq='Q'))['value'].tail(1)

print(result)
date
2023-03-31    30
2023-06-30    20
2023-09-30    40
2023-12-31    10
Name: value, dtype: int64

pd.to_datetime を使用する

pd.to_datetime を使用して、文字列形式の日付を四半期末に変換することもできます。

import pandas as pd

# 文字列形式の日付
dates = ['2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01']

# 四半期末に変換
quarter_ends = [pd.to_datetime(d + '-Q末') for d in dates]

print(quarter_ends)
[Timestamp('2023-03-31 00:00:00'), Timestamp('2023-06-30 00:00:00'), Timestamp('2023-09-30 00:00:00'), Timestamp('2023-12-31 00:00:00')]

カスタム関数を使用する

上記の方法に加えて、カスタム関数を作成して四半期末の日付を取得することもできます。

import pandas as pd

def get_quarter_end(date):
  """
  日付を四半期末に変換する関数

  Args:
    date (str): 変換対象の日付

  Returns:
    str: 四半期末の日付
  """
  year = pd.to_datetime(date).year
  quarter = (pd.to_datetime(date).month - 1) // 3 + 1
  return pd.Timestamp(f'{year}-{quarter}-Q末')

# 文字列形式の日付
dates = ['2023-01-01', '2023-04-01', '2023-07-01', '2023-10-01']

# 四半期末に変換
quarter_ends = [get_quarter_end(d) for d in dates]

print(quarter_ends)
[Timestamp('2023-03-31 00:00:00'), Timestamp('2023-06-30 00:00:00'), Timestamp('2023-09-30 00:00:00'), Timestamp('2023-12-31 00:00:00')]

選択の指針

どの方法を選択するかは、状況やデータの形式によって異なります。

  • 複雑な条件で四半期末を判定する必要がある場合は、カスタム関数を作成するのが
  • 文字列形式の日付のみを持っている場合は、pd.to_datetime またはカスタム関数を使用するのが簡単です。
  • データフレーム形式でデータを持っている場合は、pandas.Grouper を使用するのが効率的です。