【初心者向け】Pandas時系列データの基礎
データ分析において、時系列データの扱いは非常に重要です。
株価の変動、気温の変化、売上データなど、様々なデータが時系列データとして存在します。
「Pandasで時系列データを扱えるようになれば、データ分析がもっと深く、もっと面白くなる!」
そう思ったことはありませんか?
この記事では、1か月分、1年分のデータを簡単に作成する方法や、月平均データの作成方法について解説していきます。
具体的なコード例を交えながら、初心者の方でも分かりやすいように丁寧に解説します。
時系列データの基礎
1か月分のデータをつくる
import pandas as pd
df_M = pd.date_range(start='2025-02-01', end='2025-02-28')
df_M
DatetimeIndex(['2025-02-01', '2025-02-02', '2025-02-03', '2025-02-04',
'2025-02-05', '2025-02-06', '2025-02-07', '2025-02-08',
'2025-02-09', '2025-02-10', '2025-02-11', '2025-02-12',
'2025-02-13', '2025-02-14', '2025-02-15', '2025-02-16',
'2025-02-17', '2025-02-18', '2025-02-19', '2025-02-20',
'2025-02-21', '2025-02-22', '2025-02-23', '2025-02-24',
'2025-02-25', '2025-02-26', '2025-02-27', '2025-02-28'],
dtype='datetime64[ns]', freq='D')
1年(365日)のデータをつくる
df_y = pd.date_range(start='2025-02-01', periods=365)
df_y
DatetimeIndex(['2025-02-01', '2025-02-02', '2025-02-03', '2025-02-04',
'2025-02-05', '2025-02-06', '2025-02-07', '2025-02-08',
'2025-02-09', '2025-02-10',
...
'2026-01-22', '2026-01-23', '2026-01-24', '2026-01-25',
'2026-01-26', '2026-01-27', '2026-01-28', '2026-01-29',
'2026-01-30', '2026-01-31'],
dtype='datetime64[ns]', length=365, freq='D')
1年間の土曜日だけ抽出
pd.date_range(start='2025-02-01', end='2026-01-31', freq='W-SAT')
DatetimeIndex(['2025-02-01', '2025-02-08', '2025-02-15', '2025-02-22',
'2025-03-01', '2025-03-08', '2025-03-15', '2025-03-22',
'2025-03-29', '2025-04-05', '2025-04-12', '2025-04-19',
'2025-04-26', '2025-05-03', '2025-05-10', '2025-05-17',
'2025-05-24', '2025-05-31', '2025-06-07', '2025-06-14',
'2025-06-21', '2025-06-28', '2025-07-05', '2025-07-12',
'2025-07-19', '2025-07-26', '2025-08-02', '2025-08-09',
'2025-08-16', '2025-08-23', '2025-08-30', '2025-09-06',
'2025-09-13', '2025-09-20', '2025-09-27', '2025-10-04',
'2025-10-11', '2025-10-18', '2025-10-25', '2025-11-01',
'2025-11-08', '2025-11-15', '2025-11-22', '2025-11-29',
'2025-12-06', '2025-12-13', '2025-12-20', '2025-12-27',
'2026-01-03', '2026-01-10', '2026-01-17', '2026-01-24',
'2026-01-31'],
dtype='datetime64[ns]', freq='W-SAT')
月の平均値
# 乱数値という列を追加したDataFrame
import numpy as np
rng = np.random.default_rng(123)
print(rng.integers(1, 31, size=365))
df_Y = pd.DataFrame(
rng.integers(1,31, size=365),
index = df_y,
columns = ['乱数値']
)
df_Y
# 乱数値の月毎の平均を取得
df_Y.groupby(pd.Grouper(freq='ME')).mean()
2025-02-28 18.607143
2025-03-31 12.354839
2025-04-30 16.266667
2025-05-31 16.000000
2025-06-30 15.600000
2025-07-31 13.967742
2025-08-31 12.516129
2025-09-30 16.166667
2025-10-31 17.000000
2025-11-30 13.933333
2025-12-31 16.612903
2026-01-31 13.096774
# 月平均はこれでも取得できます
df_Y.loc[:,'乱数値'].resample('ME').mean()
2025-02-28 18.607143
2025-03-31 12.354839
2025-04-30 16.266667
2025-05-31 16.000000
2025-06-30 15.600000
2025-07-31 13.967742
2025-08-31 12.516129
2025-09-30 16.166667
2025-10-31 17.000000
2025-11-30 13.933333
2025-12-31 16.612903
2026-01-31 13.096774
Freq: ME, Name: 乱数値, dtype: float64
# 週ごとの平均を取得
df_Y.groupby(pd.Grouper(freq='W')).mean()
2025-02-02 19.000000
2025-02-09 16.714286
2025-02-16 22.428571
2025-02-23 22.714286
2025-03-02 10.428571
2025-03-09 10.714286
2025-03-16 11.714286
2025-03-23 12.142857
2025-03-30 15.285714
2025-04-06 17.428571
2025-04-13 14.428571
2025-04-20 14.714286
2025-04-27 19.285714
2025-05-04 14.285714
2025-05-11 14.428571
2025-05-18 17.714286
2025-05-25 13.857143
2025-06-01 16.142857
2025-06-08 13.142857
2025-06-15 12.285714
2025-06-22 20.428571
2025-06-29 17.857143
2025-07-06 14.142857
2025-07-13 11.142857
2025-07-20 12.571429
2025-07-27 18.428571
2025-08-03 16.714286
2025-08-10 13.000000
2025-08-17 14.857143
2025-08-24 7.714286
2025-08-31 11.714286
2025-09-07 21.571429
2025-09-14 16.857143
2025-09-21 15.142857
2025-09-28 13.000000
2025-10-05 11.857143
2025-10-12 14.142857
2025-10-19 18.285714
2025-10-26 15.571429
2025-11-02 23.000000
2025-11-09 9.428571
2025-11-16 15.714286
2025-11-23 14.857143
2025-11-30 14.857143
2025-12-07 18.714286
2025-12-14 17.428571
2025-12-21 17.714286
2025-12-28 13.428571
2026-01-04 12.142857
2026-01-11 11.857143
2026-01-18 14.142857
2026-01-25 14.571429
2026-02-01 13.500000
# 乱数値の週(土曜)の平均を取得
df_Y.groupby(pd.Grouper(freq='W-SAT')).mean()
2025-02-01 17.000000
2025-02-08 18.571429
2025-02-15 19.571429
2025-02-22 23.000000
2025-03-01 11.142857
2025-03-08 10.285714
2025-03-15 13.857143
2025-03-22 9.714286
2025-03-29 16.714286
2025-04-05 16.428571
2025-04-12 14.000000
2025-04-19 18.285714
2025-04-26 17.000000
2025-05-03 15.142857
2025-05-10 15.714286
2025-05-17 14.285714
2025-05-24 17.142857
2025-05-31 16.428571
2025-06-07 10.714286
2025-06-14 13.142857
2025-06-21 18.285714
2025-06-28 18.142857
2025-07-05 16.857143
2025-07-12 10.000000
2025-07-19 11.571429
2025-07-26 17.285714
2025-08-02 17.285714
2025-08-09 16.000000
2025-08-16 13.142857
2025-08-23 9.571429
2025-08-30 10.000000
2025-09-06 19.857143
2025-09-13 16.428571
2025-09-20 17.714286
2025-09-27 11.285714
2025-10-04 12.857143
2025-10-11 15.285714
2025-10-18 17.857143
2025-10-25 14.714286
2025-11-01 23.000000
2025-11-08 9.571429
2025-11-15 18.000000
2025-11-22 14.857143
2025-11-29 11.857143
2025-12-06 17.857143
2025-12-13 20.142857
2025-12-20 16.000000
2025-12-27 15.428571
2026-01-03 12.857143
2026-01-10 11.857143
2026-01-17 13.857143
2026-01-24 13.571429
2026-01-31 13.142857
Discussion