Pandas 時系列データの「頻度 (freq)」を徹底解説!効率的な指定方法 🚀


 

Pandasで時系列データを扱う際、データの時間間隔、つまり「頻度 (frequency)」を正しく理解し、指定することは非常に重要です。このfreq引数を使いこなすことで、データの生成、変換、集計が驚くほど効率的になります。本記事では、Pandasにおける時系列データの頻度の概念と、freq引数の様々な指定方法について、初心者の方にも分かりやすく解説します。


 

1. 時系列データにおける「頻度」とは? 🤔

 

時系列データにおける「頻度」とは、各データポイントがどのくらいの時間間隔で観測または記録されているかを示すものです。例えば、株価データが毎日記録されていれば「日次」、気温データが1時間ごとに記録されていれば「時間次」となります。

Pandasでは、この頻度をDateTimeIndexdate_range()関数などで指定することで、時系列データをよりスマートに扱うことができます。

 

なぜ頻度の指定が重要なのか?

 

  • データ生成: 特定の頻度で日付/時刻インデックスを簡単に生成できます。

  • データ整合性: データに欠損がある場合や不規則な頻度の場合でも、resample()などの機能で希望の頻度に変換できます。

  • 計算の効率化: 頻度が明確であることで、移動平均やリサンプリングなどの時系列操作がより正確かつ効率的に行えます。


 

2. freq引数の基本と指定方法 📊

 

Pandasでfreq引数を指定する最も一般的なケースは、pd.date_range()関数を使って連続する日付/時刻インデックスを生成する場合です。

 

基本的なfreq指定の例

 

まずは、よく使われる基本的な頻度コードを見てみましょう。

Python
 
import pandas as pd

# 日次データ (D: Day)
daily_dates = pd.date_range(start='2024-01-01', periods=5, freq='D')
print("日次データ:\n", daily_dates)

# 週次データ (W: Week) - 週の終わり(日曜)
weekly_dates = pd.date_range(start='2024-01-01', periods=3, freq='W')
print("\n週次データ (日曜終点):\n", weekly_dates)

# 月次データ (M: Month-end) - 月末
monthly_dates_end = pd.date_range(start='2024-01-01', periods=3, freq='M')
print("\n月次データ (月末):\n", monthly_dates_end)

# 月次データ (MS: Month-start) - 月初
monthly_dates_start = pd.date_range(start='2024-01-01', periods=3, freq='MS')
print("\n月次データ (月初):\n", monthly_dates_start)

# 時間次データ (H: Hour)
hourly_times = pd.date_range(start='2024-01-01 09:00', periods=3, freq='H')
print("\n時間次データ:\n", hourly_times)

実行結果:

日次データ:
 DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04',
               '2024-01-05'],
              dtype='datetime64[ns]', freq='D')

週次データ (日曜終点):
 DatetimeIndex(['2024-01-07', '2024-01-14', '2024-01-21'], dtype='datetime64[ns]', freq='W-SUN')

月次データ (月末):
 DatetimeIndex(['2024-01-31', '2024-02-29', '2024-03-31'], dtype='datetime64[ns]', freq='M')

月次データ (月初):
 DatetimeIndex(['2024-01-01', '2024-02-01', '2024-03-01'], dtype='datetime64[ns]', freq='MS')

時間次データ:
 DatetimeIndex(['2024-01-01 09:00:00', '2024-01-01 10:00:00',
               '2024-01-01 11:00:00'],
              dtype='datetime64[ns]', freq='H')

 

よく使われる頻度コード一覧

 

Pandasには非常に多くの頻度コードがあります。主要なものをいくつかご紹介します。

コード 意味
D 日次 freq='D'
W 週次 (日曜終点) freq='W'
W-MON 週次 (月曜終点) freq='W-MON'
M 月次 (月末) freq='M'
MS 月次 (月初) freq='MS'
Q 四半期次 (四半期末) freq='Q'
QS 四半期次 (四半期初) freq='QS'
A / Y 年次 (年末) freq='Y'
AS / YS 年次 (年初) freq='YS'
H 時間次 freq='H'
T / min 分次 freq='T'
S 秒次 freq='S'
L / ms ミリ秒次 freq='ms'
U / us マイクロ秒次 freq='us'
N / ns ナノ秒次 freq='ns'

 

3. 数値と組み合わせた頻度指定 🔢

 

単一の頻度コードだけでなく、数値と組み合わせて「X期間ごと」という指定もできます。

 

複数期間ごとの生成

 

Python
 
import pandas as pd

# 3日ごと
every_3_days = pd.date_range(start='2024-01-01', periods=3, freq='3D')
print("3日ごと:\n", every_3_days)

# 2時間ごと
every_2_hours = pd.date_range(start='2024-01-01 09:00', periods=3, freq='2H')
print("\n2時間ごと:\n", every_2_hours)

# 15分ごと
every_15_minutes = pd.date_range(start='2024-01-01 10:00', periods=3, freq='15T')
print("\n15分ごと:\n", every_15_minutes)

実行結果:

3日ごと:
 DatetimeIndex(['2024-01-01', '2024-01-04', '2024-01-07'], dtype='datetime64[ns]', freq='3D')

2時間ごと:
 DatetimeIndex(['2024-01-01 09:00:00', '2024-01-01 11:00:00',
               '2024-01-01 13:00:00'],
              dtype='datetime64[ns]', freq='2H')

15分ごと:
 DatetimeIndex(['2024-01-01 10:00:00', '2024-01-01 10:15:00',
               '2024-01-01 10:30:00'],
              dtype='datetime64[ns]', freq='15T')

 

4. ビジネス日、営業日などの特殊な頻度 🏢

 

Pandasは、土日を除いたビジネス日(営業日)などの特殊な頻度もサポートしています。これは金融データや業務データでよく利用されます。

 

ビジネス日 (Business Day)

 

Python
 
import pandas as pd

# 5営業日を生成 (土日を除く)
business_days = pd.date_range(start='2024-01-01', periods=5, freq='B')
print("5営業日:\n", business_days)

実行結果:

5営業日:
 DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04',
               '2024-01-05'],
              dtype='datetime64[ns]', freq='B')

2024年1月1日は月曜日なので、連続する5日間はすべて営業日になります。もし途中に土日があれば、それらはスキップされます。

 

アンカー付きオフセット (Anchored Offsets)

 

週次頻度で特定の曜日を基準にしたい場合など、W-MON (月曜終点)、BM (月末営業日) のようにハイフンでアンカー(基準日)を指定することもできます。

Python
 
import pandas as pd

# 月末営業日 (BM: Business Month-end)
business_month_end = pd.date_range(start='2024-01-01', periods=3, freq='BM')
print("月末営業日:\n", business_month_end)

# 火曜日を終点とする週次 (W-TUE)
weekly_tues = pd.date_range(start='2024-01-01', periods=3, freq='W-TUE')
print("\n火曜終点の週次:\n", weekly_tues)

実行結果:

月末営業日:
 DatetimeIndex(['2024-01-31', '2024-02-29', '2024-03-29'], dtype='datetime64[ns]', freq='BM')

火曜終点の週次:
 DatetimeIndex(['2024-01-02', '2024-01-09', '2024-01-16'], dtype='datetime64[ns]', freq='W-TUE')

 

5. freqresample()の連携 🔄

 

freq引数は、pd.date_range()だけでなく、resample()メソッドでも頻度を変更するために利用されます。

Python
 
import pandas as pd
import numpy as np

# サンプル日次データフレーム
dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
values = np.random.randint(1, 10, size=10)
df = pd.DataFrame({'Value': values}, index=dates)

print("元のデータフレーム:\n", df)

# 3日ごとに合計を算出 (ダウンサンプリング)
# '3D' を freq として resample に渡す
df_resampled = df['Value'].resample('3D').sum()

print("\n3日ごとの合計:\n", df_resampled)

実行結果:

元のデータフレーム:
             Value
2024-01-01      6
2024-01-02      4
2024-01-03      8
2024-01-04      9
2024-01-05      1
2024-01-06      8
2024-01-07      8
2024-01-08      5
2024-01-09      2
2024-01-10      8

3日ごとの合計:
 2024-01-01    18
2024-01-04    18
2024-01-07    15
2024-01-10     8
Freq: 3D, Name: Value, dtype: int64

resample('3D')とすることで、元の日次データを3日ごとの期間で区切り、その期間内のデータをsum()で合計しています。


 

6. まとめ ✨

 

Pandasのfreq引数は、時系列データを扱う上で非常に強力かつ柔軟な機能です。

  • 頻度の概念: データポイント間の時間間隔を示す。

  • pd.date_range(): freq引数を使って、指定した頻度で日付/時刻インデックスを生成する。

  • 多様な頻度コード: 'D', 'W', 'M', 'H'など、様々な時間単位やカレンダーベースの頻度を指定できる。

  • 数値との組み合わせ: 3Dのように数値と組み合わせて「X期間ごと」の頻度も指定可能。

  • 特殊な頻度: 営業日 (B) や、特定の曜日を基準とした週次 (W-MON) などもサポート。

  • resample()との連携: データの頻度変換や集計にもfreq引数が利用される。

これらのfreq指定方法をマスターすることで、Pandasでの時系列データ分析がよりスムーズかつ強力になります。ぜひ、ご自身のデータで様々な頻度指定を試してみてください!