Pythonで時系列データをリサンプリングして月末ごとの最大値を求める方法
時系列データを扱っていると、データを月単位でまとめ直し(リサンプリング)、各月の最終日(月末)を基準にした最大値を求めたい場面があります。pandasのresampleメソッドを使えば、この処理をわずか数行のコードで実現できます。
例として、次のような時系列データを含むDataFrameを想定します。リサンプリングを実行すると、以下のように月ごとの最大値が得られます。
DataFrameの内容:
Id time_series
0 1 2020-01-05
1 2 2020-01-12
2 3 2020-01-19
3 4 2020-01-26
4 5 2020-02-02
5 6 2020-02-09
6 7 2020-02-16
7 8 2020-02-23
8 9 2020-03-01
9 10 2020-03-08
月末ごとの最大値:
Id time_series
time_series
2020-01-31 4 2020-01-26
2020-02-29 8 2020-02-23
2020-03-31 10 2020-03-08
解決策
以下の手順に沿って実装していきます。
手順1:DataFrameを作成する
まず、1列だけのDataFrameを定義します。
d = {'Id': [1,2,3,4,5,6,7,8,9,10]}
df = pd.DataFrame(d)
手順2:日付データを生成する
pd.date_range()関数に開始日'01/01/2020'、periods=10、freq='W'を指定します。これにより、指定した開始日から1週間ごとの日付が10件生成され、df['time_series']列に格納されます。
df['time_series'] = pd.date_range('01/01/2020', periods=10, freq='W')
手順3:resampleメソッドで月末ごとの最大値を求める
resampleメソッドを適用し、月末頻度でリサンプリングした上で最大値を計算します。on='time_series'を指定することで、インデックスではなくtime_series列を基準にグループ化できるのがポイントです。
df.resample('M', on='time_series').max()
実装例
ここまでの手順をすべてまとめたコードは以下の通りです。
import pandas as pd
d = {'Id': [1,2,3,4,5,6,7,8,9,10]}
df = pd.DataFrame(d)
df['time_series'] = pd.date_range('01/01/2020',
periods=10,
freq='W')
print("DataFrameの内容:\n", df)
print("月末ごとの最大値:")
print(df.resample('M', on='time_series').max())
出力結果
DataFrameの内容:
Id time_series
0 1 2020-01-05
1 2 2020-01-12
2 3 2020-01-19
3 4 2020-01-26
4 5 2020-02-02
5 6 2020-02-09
6 7 2020-02-16
7 8 2020-02-23
8 9 2020-03-01
9 10 2020-03-08
月末ごとの最大値:
Id time_series
time_series
2020-01-31 4 2020-01-26
2020-02-29 8 2020-02-23
2020-03-31 10 2020-03-08
結果のインデックスには各月の最終日(2020-01-31、2020-02-29、2020-03-31)が表示され、それぞれの月に含まれる行の中でIdとtime_seriesが最大となる値が出力されていることがわかります。
補足: オフセットエイリアス'M'は「月末」を表します。なお、pandas 2.2以降では'M'は非推奨となっており、代わりに'ME'(Month End)の使用が推奨されています。
-
Pythonで指定した時刻の後に来る最も近い回文時刻を見つける方法
問題概要24時間形式(HH:MM)で時刻を表す文字列 s が与えられます。HH(時)は 0〜23、MM(分)は 0〜59 の範囲に収まります。このとき、文字列として読んだときに回文(前から読んでも後ろから読んでも同じになる文字列)となる、s より後のもっとも近い時刻を求めてください。該当する時刻が存在しない場合は -1 を返します。たとえば、入力が「22:22」であれば、出力は「23:32」となります。解法のアプローチこの問題は、次の手順に従って解くことができます。n := 文字列 s の長さhour_string := s の先頭2文字(インデックス 0〜2)を切り出した部分文字列minut
-
PythonでO(n)時間・O(1)の追加メモリを使って最大出現回数の数値を見つける方法
問題の概要サイズ n の配列が与えられ、その要素はすべて 0 から k−1 の範囲に含まれているとします。ここで k は正の整数であり、k ≤ n を満たすものとします。この条件のもとで、配列の中で最も多く出現する数値(最大繰り返し数)を見つけることが課題です。たとえば、k = 8、A = [3, 4, 4, 6, 4, 5, 2, 8] という入力が与えられた場合、4 は3回出現して最も多いため、出力は 4 となります。アルゴリズムの考え方この問題は、ハッシュマップやカウンタ用の追加配列を使わずに解くことができます。ポイントは「各要素の値が必ず k 未満である」という制約を利用することです。