Pandasで時系列データを扱う基礎:DataFrameとSeriesの活用術 🗓️


 

データ分析において、時系列データは非常に重要です。株価、気温、売上データなど、時間の経過とともに変化するデータは多岐にわたります。Pandasは、時系列データを効率的に扱うための強力な機能を提供しており、特にDataFrameSeriesは時系列分析の中心となります。本記事では、Pandasを使って時系列データを処理する基本的な方法を、初心者の方にも分かりやすく解説します。


 

1. 時系列データとは? 🕰️

 

時系列データとは、時間順に並べられたデータポイントの集合のことです。各データポイントには、それが観測された特定の時点が関連付けられています。

 

時系列データの特徴

 

  • 順序性: データは時間の経過とともに順序付けられています。

  • 時間間隔: データポイント間の時間間隔は、一定(例: 毎日、毎月)の場合もあれば、不規則な場合もあります。

  • トレンド、季節性、周期性: 多くの時系列データには、長期的な傾向(トレンド)、特定の季節に繰り返されるパターン(季節性)、周期的な変動(周期性)が見られます。


 

2. Pandasでの時系列データ表現 📊

 

Pandasでは、主にDateTimeIndexをインデックスとして持つSeriesDataFrameを用いて時系列データを扱います。

 

 to_datetime()で日付文字列を変換

 

Pandasで時系列データを扱う第一歩は、日付や時刻を表す文字列をdatetime型に変換することです。pd.to_datetime()関数がこの役割を担います。

Python
 
import pandas as pd

# 日付文字列のリスト
date_strings = ['2024-01-01', '2024/01/02', 'Jan 3, 2024']

# datetime型に変換
dates = pd.to_datetime(date_strings)

print(dates)

実行結果:

DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03'], dtype='datetime64[ns]', freq=None)

さまざまな形式の日付文字列を自動で認識し、datetime64[ns]型に変換してくれます。

 

H3: date_range()で日付範囲を生成

 

連続した日付や時刻のインデックスが必要な場合は、pd.date_range()関数が便利です。

Python
 
import pandas as pd

# 2024年1月1日から10日間、毎日生成
daily_dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
print("日次データ:\n", daily_dates)

# 2024年1月から3ヶ月間、月初に生成
monthly_dates = pd.date_range(start='2024-01-01', periods=3, freq='MS')
print("\n月次データ:\n", monthly_dates)

実行結果:

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

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

freq引数で頻度を指定できます。'D'は日次、'MS'は月初を意味します。他にも様々な頻度コードがあります(例: 'H'時間、'T'分、'W'週次など)。

 

 時系列Series/DataFrameの作成

 

DateTimeIndexをインデックスに設定することで、時系列SeriesDataFrameを作成できます。

Python
 
import pandas as pd
import numpy as np

# 日次データでSeriesを作成
dates = pd.date_range(start='2024-01-01', periods=5, freq='D')
temperatures = pd.Series(np.random.randint(10, 25, size=5), index=dates, name='Temperature')
print("時系列Series:\n", temperatures)

# 日次データでDataFrameを作成
data = {'Sales': np.random.randint(100, 200, size=5),
        'Cost': np.random.randint(50, 100, size=5)}
df_time_series = pd.DataFrame(data, index=dates)
print("\n時系列DataFrame:\n", df_time_series)

実行結果:

時系列Series:
 2024-01-01    24
2024-01-02    14
2024-01-03    21
2024-01-04    11
2024-01-05    12
Freq: D, Name: Temperature, dtype: int64

時系列DataFrame:
             Sales  Cost
2024-01-01    190    57
2024-01-02    129    76
2024-01-03    133    85
2024-01-04    118    54
2024-01-05    109    96

 

3. 時系列データの操作 ⚙️

 

時系列データは、日付や時刻を基準とした便利な操作が可能です。

 

H3: 時刻ベースの選択 (Indexing/Slicing)

 

DateTimeIndexを持つデータフレームは、日付や時刻を指定してデータを簡単に選択できます。

Python
 
import pandas as pd
import numpy as np

# サンプルDataFrame
dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
data = {'Value': np.random.randint(100, 200, size=10)}
df = pd.DataFrame(data, index=dates)

print("元のDataFrame:\n", df)

# 特定の日のデータを取得
print("\n2024-01-05のデータ:\n", df.loc['2024-01-05'])

# 日付範囲でデータをスライス
print("\n2024-01-03から2024-01-07のデータ:\n", df['2024-01-03':'2024-01-07'])

# 年月でデータをスライス
print("\n2024年1月のデータ:\n", df['2024-01'])

実行結果:

元のDataFrame:
             Value
2024-01-01    150
2024-01-02    155
2024-01-03    190
2024-01-04    101
2024-01-05    144
2024-01-06    105
2024-01-07    194
2024-01-08    169
2024-01-09    134
2024-01-10    102

2024-01-05のデータ:
 Value    144
Name: 2024-01-05 00:00:00, dtype: int64

2024-01-03から2024-01-07のデータ:
             Value
2024-01-03    190
2024-01-04    101
2024-01-05    144
2024-01-06    105
2024-01-07    194

2024年1月のデータ:
             Value
2024-01-01    150
2024-01-02    155
2024-01-03    190
2024-01-04    101
2024-01-05    144
2024-01-06    105
2024-01-07    194
2024-01-08    169
2024-01-09    134
2024-01-10    102

日付や年月を指定するだけで、直感的にデータを抽出できます。

 

 リサンプリング (Resampling)

 

リサンプリングは、時系列データの頻度を変更する操作です。例えば、日次データを週次や月次に集計したり、逆に短い頻度に変換したりできます。

  • ダウンサンプリング: 高い頻度から低い頻度へ(例: 日次 → 月次)

  • アップサンプリング: 低い頻度から高い頻度へ(例: 月次 → 日次、通常は補間が必要)

Python
 
import pandas as pd
import numpy as np

# サンプルDataFrame (日次データ)
dates = pd.date_range(start='2024-01-01', periods=30, freq='D')
data = {'Sales': np.random.randint(100, 500, size=30)}
df = pd.DataFrame(data, index=dates)

print("日次データ (先頭5行):\n", df.head())

# 週次で合計を計算 (ダウンサンプリング)
weekly_sales = df['Sales'].resample('W').sum()
print("\n週次合計売上:\n", weekly_sales)

# 月次で平均を計算 (ダウンサンプリング)
monthly_avg_sales = df['Sales'].resample('M').mean()
print("\n月次平均売上:\n", monthly_avg_sales)

実行結果:

日次データ (先頭5行):
             Sales
2024-01-01    449
2024-01-02    271
2024-01-03    203
2024-01-04    129
2024-01-05    409

週次合計売上:
 Date
2024-01-07    2018
2024-01-14    2054
2024-01-21    2313
2024-01-28    2226
2024-02-04     747
Freq: W-SUN, Name: Sales, dtype: int64

月次平均売上:
 Date
2024-01-31    283.7
Freq: M, Name: Sales, dtype: float64

resample()メソッドの後には、sum(), mean(), min(), max()などの集計関数を続けて呼び出します。


 

4. まとめ ✨

 

PandasのDataFrameSeriesは、時系列データを扱う上で非常に強力なツールです。

  • pd.to_datetime()で文字列をdatetime型に変換する。

  • pd.date_range()で連続した日付インデックスを生成する。

  • DateTimeIndexを持つSeriesDataFrameを作成し、時系列データとして処理する。

  • 時刻ベースのインデックスやスライスでデータを簡単に選択する。

  • resample()を使ってデータの頻度を変更し、集計する。

これらの機能を使いこなすことで、時系列データの準備から分析までを効率的に行うことができます。ぜひ、ご自身の時系列データでこれらの操作を試してみてください!