【超便利】pandasで四半期末かどうかを瞬時に判定!QuarterEnd.is_quarter_endの使い方とサンプルコード集


pandas.tseries.offsets.QuarterEnd.is_quarter_end は、指定された日付が四半期末かどうかを判定する関数です。

使い方

import pandas as pd

# サンプルデータ
dates = pd.to_datetime(['2024-01-31', '2024-02-29', '2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30'])

# 各日付が四半期末かどうか判定
is_quarter_end = QuarterEnd().is_quarter_end(dates)
print(is_quarter_end)

出力

[ True  False  True  True  False  True]

解説

  • 上記の例では、dates 内の日付のうち、1月31日、3月31日、4月30日、6月30日は四半期末であるため、True が返されています。
  • is_quarter_end() メソッドは、オフセットと比較して、日付がオフセットに一致するかどうかを判定します。
  • QuarterEnd() は、四半期末を表すオフセットを生成します。
  • QuarterEnd は、四半期末を判定するだけでなく、四半期末の日付を生成したり、四半期末に移動したりすることもできます。
  • startingMonth 引数で、四半期が始まる月を指定できます。デフォルトは3月です。
  • 四半期末の株価を分析する
  • 四半期ごとにレポートを作成する
  • 四半期ごとの売上データを集計する


サンプル 1:四半期ごとの売上データを集計

import pandas as pd

# サンプルデータ
data = {
    'date': pd.to_datetime(['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-12', '2023-05-05', '2023-06-22']),
    'sales': [100, 150, 220, 250, 300, 350]
}

df = pd.DataFrame(data)

# 四半期ごとに集計
df_quarterly = df.resample('Q-T', on='date').sum()
print(df_quarterly)

出力

        sales
quarter
2023Q1    470
2023Q2    550
2023Q3    350

解説

  • sum() で、各四半期における売上を合計します。
  • resample('Q-T', on='date') で、date 列を基準に四半期ごとにデータを集計します。

サンプル 2:四半期ごとにレポートを作成

import pandas as pd

# サンプルデータ
data = {
    'date': pd.to_datetime(['2023-01-10', '2023-02-15', '2023-03-20', '2023-04-12', '2023-05-05', '2023-06-22']),
    'sales': [100, 150, 220, 250, 300, 350],
    'product': ['A', 'A', 'B', 'B', 'C', 'C']
}

df = pd.DataFrame(data)

# 四半期ごとに集計
df_quarterly = df.resample('Q-T', on='date').agg({
    'sales': 'sum',
    'product': 'nunique'
})

# レポートを作成
for quarter, row in df_quarterly.iterrows():
    print(f"## {quarter}売上レポート")
    print(f"売上: {row['sales']}")
    print(f"販売商品数: {row['product']}")

出力

## 2023Q1売上レポート
売上: 470
販売商品数: 2

## 2023Q2売上レポート
売上: 550
販売商品数: 2

## 2023Q3売上レポート
売上: 350
販売商品数: 1
  • 各四半期ごとに、売上レポートを出力します。
  • iterrows で、集計結果をループ処理します。
  • agg で、各四半期における売上と販売商品数を集計します。
  • resample('Q-T', on='date') で、date 列を基準に四半期ごとにデータを集計します。
import pandas as pd
import yfinance as yf

# サンプルデータ
ticker = 'AAPL'  # Apple社の株価データを取得

# 四半期末を取得
quarter_ends = pd.date_range(start='2020-01-01', end='2024-06-30', freq='Q-END')

# 株価データを取得
data = yf.download(ticker, start=quarter_ends[0], end=quarter_ends[-1])['Adj Close']

# 四半期末ごとに株価を分析
for quarter_end, price in data.iteritems():
    print(f"{quarter_end.strftime('%Y-%


代替方法

以下に、pandas.tseries.offsets.QuarterEnd.is_quarter_end の代替方法をいくつか紹介します。

month 属性と比較

最も簡単な方法は、month 属性と比較することです。四半期末は 3月、6月、9月、12月なので、以下の式で判定できます。

is_quarter_end = (df['date'].dt.month % 3 == 0) & (df['date'].dt.is_month_end)

QuarterEnd オブジェクトを使用

QuarterEnd オブジェクトを使用して、四半期末の日付を生成し、比較する方法もあります。

quarter_ends = pd.offsets.QuarterEnd()
is_quarter_end = df['date'].dt.is_on(quarter_ends)

カスタム関数を使用

より複雑な判定が必要な場合は、カスタム関数を作成する方法もあります。

def is_quarter_end(date):
    if date.month in [3, 6, 9, 12] and date.day == date.days_in_month:
        return True
    else:
        return False

is_quarter_end = df['date'].apply(is_quarter_end)

numpy.vectorize を使用する

上記のカスタム関数をベクトル化したい場合は、numpy.vectorize を使用できます。

import numpy as np

is_quarter_end_vec = np.vectorize(is_quarter_end)
is_quarter_end = is_quarter_end_vec(df['date'])

選択のポイント

どの方法を選択するかは、データ量や処理速度、必要な精度などを考慮して決定する必要があります。

  • 高い精度が必要な場合は、QuarterEnd オブジェクトを使用 する方法がおすすめです。
  • より複雑な判定が必要な場合は、カスタム関数を使用 または numpy.vectorize を使用する 方法が適しています。
  • データ量が少なく、処理速度が重要でない場合は、month 属性と比較 が最も簡単で効率的です。
  • それぞれの方法の性能や精度を比較するために、ベンチマークを実施することをおすすめします。
  • 上記の代替方法は、pandas 1.0.0 以降で使用できます。