我有一个带有DatetimeIndex
的pandas.Dataframe
。数据每30分钟采样一次(可以不同(。我想每小时对数据重新采样一次,对于每个组,我想提取特定列上具有最高值的行。
例如
WindDir WindSpeed Temperature CloudHgt
Date
2020-01-01 00:20:00 150.0 3.6 5.0 213.0
2020-01-01 00:50:00 150.0 3.1 5.0 213.0
2020-01-01 01:20:00 130.0 4.1 5.0 183.0
2020-01-01 01:50:00 130.0 3.6 5.0 183.0
2020-01-01 02:20:00 130.0 3.1 4.0 244.0
2020-01-01 02:50:00 140.0 3.6 4.0 366.0
2020-01-01 03:20:00 130.0 2.6 3.0 99999.0
2020-01-01 03:50:00 160.0 2.6 3.0 91.0
2020-01-01 04:20:00 170.0 2.6 3.0 61.0
2020-01-01 04:50:00 180.0 2.6 3.0 30.0
2020-01-01 05:20:00 150.0 1.5 3.0 183.0
2020-01-01 05:50:00 190.0 2.1 3.0 30.0
2020-01-01 06:20:00 190.0 2.1 3.0 122.0
2020-01-01 06:50:00 220.0 1.5 3.0 152.0
2020-01-01 07:20:00 230.0 2.1 3.0 213.0
2020-01-01 07:50:00 230.0 1.5 3.0 244.0
2020-01-01 08:20:00 999.0 1.0 3.0 335.0
2020-01-01 08:50:00 999.0 0.5 3.0 335.0
2020-01-01 09:20:00 120.0 2.1 3.0 335.0
我想重新采样获得:
WindDir WindSpeed Temperature CloudHgt
Date
2020-01-01 00:00:00 150.0 3.6 5.0 213.0
2020-01-01 01:00:00 130.0 4.1 5.0 183.0
2020-01-01 02:00:00 130.0 3.6 5.0 183.0
2020-01-01 03:00:00 140.0 3.6 4.0 366.0
2020-01-01 04:00:00 160.0 2.6 3.0 91.0
2020-01-01 05:00:00 180.0 2.6 3.0 30.0
2020-01-01 06:00:00 190.0 2.1 3.0 30.0
2020-01-01 07:00:00 230.0 2.1 3.0 213.0
2020-01-01 08:00:00 230.0 1.5 3.0 244.0
2020-01-01 09:00:00 120.0 2.1 3.0 335.0
我读了一些关于SO的问题,比如这个,这个,这个和这个。然而,大多数都集中在没有DatetimeIndex的数据帧上,对于这些数据帧,样本的顺序无关紧要。此外,由于Groupby用该组的开始时间重新标记该组,因此查找具有相同索引的样本是不可行的。
我使用apply(lambda group: group.nlargest(1, columns=column))
找到了一个有效的解决方案。然而,这在大型数据帧上非常缓慢。
目前我的代码看起来像:
# define grouper
grouper = pd.Grouper(freq='1H', offset='30min')
# aggregate data (except wind dir)
resampled = (data
.groupby(grouper)
.apply(lambda group: group.nlargest(1, columns=column))
.reset_index(level=-1, drop=True)
).shift(30,'min')
有没有更好的解决方案不使用apply
函数,因为它非常慢
df.groupby(df.index.ceil(freq="H")).apply(lambda x: x.loc[x.WindDir.idxmax(), :])
# WindDir WindSpeed Temperature CloudHgt
# Date
# 2020-01-01 01:00:00 150.0 3.6 5.0 213.0
# 2020-01-01 02:00:00 130.0 4.1 5.0 183.0
# 2020-01-01 03:00:00 140.0 3.6 4.0 366.0
# 2020-01-01 04:00:00 160.0 2.6 3.0 91.0
# 2020-01-01 05:00:00 180.0 2.6 3.0 30.0
# 2020-01-01 06:00:00 190.0 2.1 3.0 30.0
# 2020-01-01 07:00:00 220.0 1.5 3.0 152.0
# 2020-01-01 08:00:00 230.0 2.1 3.0 213.0
# 2020-01-01 09:00:00 999.0 1.0 3.0 335.0
# 2020-01-01 10:00:00 120.0 2.1 3.0 335.0