我有一个Pandas DataFrame,它的值是整个一年中每25分钟一次。
Datum
2017-01-01 00:15:00 223.1500
2017-01-01 00:30:00 224.8000
2017-01-01 00:45:00 229.3500
2017-01-01 01:00:00 226.7500
2017-01-01 01:15:00 221.9500
2017-01-01 01:30:00 225.7500
2017-01-01 01:45:00 230.7000
现在,我要绘制所有周平均值的每季度的最小值,平均值和最大值。
因此,最后我应该有一个包含672行(周一00:00,周一00:15,周一00:30,...,周日23:30,周日23:45)的DataFrame,并带有最小值,最大值,卑鄙的。
我尝试了df.groupby()
,也尝试了resample()
,但没有成功。
答案 0 :(得分:3)
您可以使用groupby()
和agg()
来实现:
一些示例数据:
import pandas as pd
import numpy as np
np.random.seed(444)
idx = pd.date_range('2017', end='2018', freq='15min')[:-1]
df = pd.DataFrame(np.random.randint(2000, 3000, size=idx.size) / 10,
index=idx, columns=['data'])
以及您要查找的操作:
to_grp = [df.index.weekday_name, df.index.time]
grp = df.groupby(to_grp, squeeze=True)['data'].agg(['min', 'mean', 'max'])
这是一个片段:
>>> grp.head()
min mean max
Friday 00:00:00 200.5 255.253846 299.7
00:15:00 200.2 250.359615 299.9
00:30:00 204.0 248.376923 299.4
00:45:00 203.9 258.228846 299.9
01:00:00 200.0 252.519231 298.6
>>> grp.shape
(672, 3)
我原以为您可以使用pd.Grouper(freq='15min')
代替df.index.time
,但这似乎在给您带来麻烦。