カテゴリ: Python 更新日: 2026/07/13

Pythonで時系列データを分析する方法!Pandasのresample()の使い方を完全ガイド

Pythonで時系列データを分析する方法!Pandasのresample()の使い方
Pythonで時系列データを分析する方法!Pandasのresample()の使い方

先生と生徒の会話形式で理解しよう

生徒

「Pythonを使って、毎日記録している売上データを『月ごと』や『週ごと』にまとめて集計したいのですが、手作業だと大変そうで……。何か良い方法はありますか?」

先生

「それは『時系列データ分析』の得意分野ですね!PythonのPandasというライブラリにあるresampleメソッドを使えば、驚くほど簡単に期間を切り替えて集計できますよ。」

生徒

「リサンプル……?難しそうな名前ですね。プログラミング初心者でも使いこなせるでしょうか?」

先生

「大丈夫です。時計の針を進めたり戻したりするようなイメージで操作できるので、基本さえ押さえれば簡単です。具体的な使い方をステップバイステップで見ていきましょう!」

1. 時系列データ分析とPandasのresampleメソッドとは?

1. 時系列データ分析とPandasのresampleメソッドとは?
1. 時系列データ分析とPandasのresampleメソッドとは?

時系列データとは、時間の経過とともに記録されたデータのことを指します。例えば、日々の気温、株価の変動、Webサイトのアクセス数、お店の売上履歴などがこれに当たります。これらのデータを分析する際、「1日ごとの細かいデータを1ヶ月ごとの大きなまとまりで見たい」という場面がよくあります。

この「データの時間間隔を変更する作業」をリサンプリング(Resampling)と呼びます。そして、Pythonのデータ分析用ツールであるPandas(パンダス)が提供する強力な武器がresample()メソッドです。

Pandasは、大量のデータを表形式(Excelのような見た目)で扱うのが得意なライブラリです。その中でもresample()は、日付や時刻を基準にしてデータをグループ化し、合計や平均を計算するために欠かせない機能となっています。

2. resampleを使うための準備:日付データを準備しよう

2. resampleを使うための準備:日付データを準備しよう
2. resampleを使うための準備:日付データを準備しよう

resample()を使うには、一つだけ重要なルールがあります。それは、表の「インデックス(行のラベル)」が日付や時刻の形式になっていなければならないということです。

パソコンは、単なる「2024-01-01」という文字を、最初はただの文字列として認識します。これを「日付である」と教えてあげることで、初めて「1ヶ月後」や「1週間」という計算ができるようになります。

まずは、簡単なサンプルデータを作って、日付をインデックスに設定する方法を見てみましょう。


import pandas as pd

# 1. サンプルのデータを作成(日付と売上)
data = {
    'date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-02-01', '2024-02-15'],
    'sales': [100, 150, 200, 300, 400]
}
df = pd.DataFrame(data)

# 2. 'date'列を文字列から「日付型(datetime)」に変換
df['date'] = pd.to_datetime(df['date'])

# 3. 日付列をインデックス(行の基準)に設定
df.set_index('date', inplace=True)

print(df)

            sales
date             
2024-01-01    100
2024-01-02    150
2024-01-03    200
2024-02-01    300
2024-02-15    400

3. データを「月ごと」に集計してみよう(ダウンサンプリング)

3. データを「月ごと」に集計してみよう(ダウンサンプリング)
3. データを「月ごと」に集計してみよう(ダウンサンプリング)

それでは、いよいよresample()を使ってみます。細かいデータ(日単位)から、より粗いデータ(月単位)にまとめることをダウンサンプリングと呼びます。

例えば、1月の売上合計と2月の売上合計を別々に計算したい場合、resample('ME')(Month Endの略)を指定します。


# 月ごとにリサンプリングして、売上の「合計」を計算
monthly_sales = df.resample('ME').sum()

print(monthly_sales)

            sales
date             
2024-01-31    450
2024-02-29    700

実行結果を見ると、1月のデータ(100+150+200=450)と2月のデータ(300+400=700)がそれぞれ集計されているのがわかりますね。末日の日付が表示されるのが基本の挙動です。

4. よく使う頻度コードの一覧

4. よく使う頻度コードの一覧
4. よく使う頻度コードの一覧

resample()のカッコの中に入れる文字を変えるだけで、集計する単位を自由自在に操ることができます。これらは「頻度コード」や「オフセットエイリアス」と呼ばれます。

コード 意味 解説
'D' 日単位(Day) 毎日ごとの集計に使います。
'W' 週単位(Week) 日曜区切りなどで集計します。
'ME' 月単位(Month End) 月末で区切って集計します。
'QE' 四半期単位(Quarter End) 3ヶ月ごとの区切りです。
'YE' 年単位(Year End) 1年ごとの集計に使います。

5. 平均や最大値を求める応用テクニック

5. 平均や最大値を求める応用テクニック
5. 平均や最大値を求める応用テクニック

集計は「合計(sum)」だけではありません。データの性質に合わせて、平均値を知りたいときはmean()、一番高い数値を知りたいときはmax()を使います。

例えば、工場のセンサーデータなどを扱っていて「週ごとの平均気温」を出したい、といった場合に非常に役立ちます。


# 1週間ごとの「平均」売上を算出する例
weekly_average = df.resample('W').mean()

# 1週間ごとの「最大」売上を算出する例
weekly_max = df.resample('W').max()

print("--- 週ごとの平均 ---")
print(weekly_average)

--- 週ごとの平均 ---
            sales
date             
2024-01-07  150.0
2024-01-14    NaN
2024-01-21    NaN
2024-01-28    NaN
2024-02-04  300.0
2024-02-11    NaN
2024-02-18  400.0

ここでNaNという文字が出てきましたね。これは「Not a Number」の略で、プログラミングの世界では「データが存在しない(空っぽ)」ということを意味します。データがない週は計算できないため、このように表示されます。

6. 欠損値を埋める方法(アップサンプリング)

6. 欠損値を埋める方法(アップサンプリング)
6. 欠損値を埋める方法(アップサンプリング)

先ほどとは逆に、粗いデータ(月単位)から細かいデータ(日単位)に増やすことをアップサンプリングと呼びます。この時、元のデータには無かった「間の日」のデータは空っぽ(NaN)になってしまいます。

これを埋めるための便利な機能がいくつかあります。

  • ffill():前のデータと同じ値で埋める(前方向に進む)
  • bfill():後のデータと同じ値で埋める(後ろから戻る)
  • interpolate():中間を計算して滑らかに埋める(補間)

# 2月1日のデータ(300)から2月15日のデータ(400)の間を毎日埋めてみる
# とりあえず日単位に広げる
daily_df = df.resample('D').asfreq()

# 前の値で埋める(ffill)
filled_df = daily_df.ffill()

print(filled_df.head(10)) # 最初の10行だけ表示

            sales
date             
2024-01-01  100.0
2024-01-02  150.0
2024-01-03  200.0
2024-01-04  200.0
2024-01-05  200.0
2024-01-06  200.0
2024-01-07  200.0
2024-01-08  200.0
2024-01-09  200.0
2024-01-10  200.0

7. 複数の集計を一度に行う「agg」メソッド

7. 複数の集計を一度に行う「agg」メソッド
7. 複数の集計を一度に行う「agg」メソッド

「合計も知りたいし、平均も同時に知りたい!」というわがままな要望にも応えられます。agg()(アグリゲーションの略、集約という意味)を使えば、リスト形式で関数を渡すことができます。

これにより、一つのデータフレーム(表)から、複数の視点での分析結果を一度に得ることができ、コードの記述量も減ってスッキリします。


# 月ごとに「合計」「平均」「データ数」を同時に計算
multi_summary = df.resample('ME')['sales'].agg(['sum', 'mean', 'count'])

print(multi_summary)

            sum   mean  count
date                         
2024-01-31  450  150.0      3
2024-02-29  700  350.0      2

この表を見れば、1月は3回の取引があって合計450、1回あたりの平均は150だった、ということが一目瞭然ですね。

8. 実践:株価データのような不規則なデータを整える

8. 実践:株価データのような不規則なデータを整える
8. 実践:株価データのような不規則なデータを整える

実際の仕事や研究で扱うデータは、土日が休みだったり、深夜に記録がなかったりと、不規則なことが多いです。resample()は、そのようなバラバラな時間の記録を、一定の間隔に整える「整列」の役割も果たします。

例えば、不規則な時間に行われたWebサイトへの「クリック」ログを、1時間ごとのアクセス数グラフに変換したいときなどは、まさにこの手法が使われます。

プログラミング未経験の方は、まずは「データを箱に分けて入れる」イメージを持ってください。1時間という箱を用意して、その時間内に入ったデータを全部放り込み、最後に箱の中身を数える。これがresample()の正体です。

9. 初心者がつまずきやすいポイントと解決策

9. 初心者がつまずきやすいポイントと解決策
9. 初心者がつまずきやすいポイントと解決策

せっかくコードを書いても、エラーが出て動かないと悲しいですよね。resample()を使うときによくあるトラブルを2つ紹介します。

1. インデックスが日付になっていない
「TypeError: Only valid with DatetimeIndex」というエラーが出たら、インデックスを確認しましょう。df.indexを見て、それがDatetimeIndexになっているか確認するのがコツです。

2. 頻度コードの指定ミス
昔のPandasでは「M」と書いていた月間集計が、最新のバージョンでは「ME」に変わるなど、細かい変更があります。もしエラーが出た場合は、最新の公式ドキュメントを確認するか、代表的な「'D', 'W', 'ME', 'YE'」を試してみましょう。

Pythonのデータ分析は、最初は難しく感じるかもしれませんが、こうした便利なツールを一つずつ覚えることで、どんどん楽しくなっていきます。特に時系列データは、未来を予測したり過去の傾向を知るための宝の山です。ぜひ、身近なデータを使って試してみてくださいね。

まとめ

まとめ
まとめ

今回の記事では、Pythonのデータ分析用ライブラリであるPandasを使い、時系列データを自由自在に操るための「resample()メソッド」について詳しく解説してきました。 時系列データ分析は、ビジネスにおける売上予測やマーケティングの効果測定、製造現場のセンサーログ解析など、現代のデータ活用において避けては通れない非常に重要なスキルです。

Pandasのresample()でできることの振り返り

リサンプリングには大きく分けて、細かい単位から粗い単位にまとめる「ダウンサンプリング」と、粗い単位から細かい単位へデータを増やす「アップサンプリング」の2種類があります。 特にダウンサンプリングは、日次データを月次や週次に変換してトレンドを把握する際に威力を発揮します。一方でアップサンプリングは、欠損している時間のデータを補完し、データの密度を一定に保つために利用されます。

時系列データ分析を成功させるための3ステップ

  1. 日付型の変換: pd.to_datetime()を使用して、文字列データをPythonが理解できる日付オブジェクトに変換する。
  2. インデックスの設定: set_index()で日付列をインデックスに指定する。これがresample()を使うための必須条件です。
  3. 適切な頻度コードの選択: 'ME'(月末)、'W'(週)、'D'(日)など、目的に合わせたオフセットエイリアスを指定する。

実践的なサンプルコード:複数の統計量を一括取得

ここでは、実際の業務でもよく使われる「複数の集計を一気に行う方法」を改めてコードで示します。 売上データに対して、月ごとの合計金額だけでなく、平均単価や取引件数を一度に算出することで、より深い洞察が得られます。


import pandas as pd

# サンプルデータの作成(広範囲な日付を持つデータ)
raw_data = {
    'date': ['2024-01-05', '2024-01-20', '2024-02-10', '2024-02-25', '2024-03-05'],
    'revenue': [12000, 15000, 22000, 18000, 30000],
    'customers': [5, 8, 12, 10, 15]
}
df_sample = pd.DataFrame(raw_data)

# 日付型への変換とインデックス設定
df_sample['date'] = pd.to_datetime(df_sample['date'])
df_sample.set_index('date', inplace=True)

# 月末(ME)ごとにリサンプリングし、各列に異なる集計処理を適用
# revenueには合計(sum)と平均(mean)、customersには最大値(max)を適用
summary_report = df_sample.resample('ME').agg({
    'revenue': ['sum', 'mean'],
    'customers': 'max'
})

print("--- 月別売上・顧客数レポート ---")
print(summary_report)

このように、agg()メソッドを組み合わせることで、複雑な集計もシンプルに記述可能です。 Pandasを活用した時系列分析は、一見難解に見えるかもしれませんが、一度基本構造を理解してしまえば、Excelで行っていた数時間の作業を数秒で終わらせることができます。 データサイエンスの第一歩として、ぜひこのresample()をマスターし、データから価値ある情報を引き出せるようになりましょう。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!resample()を使うと、あんなにバラバラだった売上データが、あっという間に綺麗な月別グラフの元データになるんですね。正直、驚きました。」

先生

「そう言ってもらえると嬉しいです。特に『日付をインデックスにする』というルールさえ守れば、あとは魔法のキーワード(頻度コード)を入れるだけですからね。作業効率が劇的に上がったでしょう?」

生徒

「はい!ただ、途中で出てきたNaNには少し焦りました。データがないことを意味するんですね。ffill()を使って前の値をコピーして埋める方法は、在庫管理のデータなんかでも使えそうだと思いました。」

先生

「素晴らしい着眼点です!在庫のように、変動があった時だけ記録されるデータの場合、何もない日は『前日と同じ』とみなすことが多いので、ffill()は非常に有効な手段になります。」

生徒

「最後に教えてもらったagg()も便利ですね。合計だけじゃなくて、平均や最大値を一度に見ることで、『この月は売上は高いけど、1件あたりの単価は低いな』といった分析までできそうです。」

先生

「その通りです。ただ数字を出すだけでなく、その数字が何を意味するのかを考えるのがデータ分析の本質です。PythonとPandasは、その『考える時間』を作るための強力なパートナーになってくれますよ。次はぜひ、実際のCSVファイルを読み込んで試してみてくださいね!」

生徒

「はい、やってみます!自分の周りにあるデータが宝の山に見えてきました。もっと勉強して、Pythonを使いこなせるよう頑張ります!」

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
Python のデータ分析と科学計算の記事一覧へ
新着記事
New1
Python
Pythonの変数とは?定義方法とデータ型を初心者向けに解説
New2
PHP
PHP の型変換を完全ガイド!初心者でもわかる明示的変換・自動変換
New3
PHP
PHPのCSVファイルの読み書きと文字列処理を基礎から解説!初心者向けガイド
New4
PHP
PHPのメモリ管理と変数の破棄方法をやさしく解説!初心者でもわかるunsetの使い方
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでAPIリクエストを送信する方法を完全解説!requestsライブラリで簡単API通信
No.2
Java&Spring記事人気No2
Python
Pythonで経過時間を計測する方法を完全解説!初心者でもわかる time.perf_counter() と time.sleep()
No.3
Java&Spring記事人気No3
Python
Pythonのコンストラクタ(__init__)の使い方!初心者でもわかるオブジェクトの初期化
No.4
Java&Spring記事人気No4
PHP
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.5
Java&Spring記事人気No5
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
Python
Pythonのタプルの要素を変更できない理由とその回避策を初心者向けに解説
No.7
Java&Spring記事人気No7
ChatGPT
ChatGPTでPythonコードを作成する方法!プロンプトの書き方と質問例を解説
No.8
Java&Spring記事人気No8
Python
Pythonのrequestsライブラリ完全入門!HTTPリクエストの送り方を初心者向けにやさしく解説