提问人:forestbat 提问时间:10/30/2022 更新时间:10/30/2022 访问量:63
如何在熊猫中通过Dataframe.rolling选择具有特殊步骤的数据系列?
How to select data series with special steps by Dataframe.rolling in pandas?
问:
我有一个数据帧,看起来像这样,索引是numpy的:datetime64
(index) data
2017-01-01 00:00:00 1
2017-01-01 01:00:00 2
2017-01-01 02:00:00 3
…… ……
2017-01-04 00:00:00 73
2017-01-04 01:00:00 nan
2017-01-04 02:00:00 75
…… ……
现在我想在滚动窗口中获取数据,这些窗口的宽度都是 72(72 小时),并且两个窗口之间没有交集,如下所示:
windows1:
(index) data
2017-01-01 00:00:00 1
2017-01-01 01:00:00 2
2017-01-01 02:00:00 3
…… ……
2017-01-03 23:00:00 72
windows2:
(index) data
2017-01-04 00:00:00 73
# data of 2017-01-04 01:00:00 is nan, removed
2017-01-01 02:00:00 75
…… ……
2017-01-03 23:00:00 144
那么如何通过或实现这一点呢?如果没有简单的答案,我将使用索引本身来解决问题。DataFrame.rolling
DataSeries.rolling
答:
1赞
mozway
10/30/2022
#1
72 小时滚动可以通过以下方式实现(或任何其他功能df.rolling('72H').sum()
sum
)
但看起来你不想要一个,而是一个带地板
的 groupby
:rolling
for k,g in df.groupby(df.index.floor('72H')):
print(f'New group: {k}\n', g.head(), '\n')
输出:
New group: 2016-12-31 00:00:00
data
index
2017-01-01 00:00:00 1
2017-01-01 01:00:00 2
2017-01-01 02:00:00 3
2017-01-01 03:00:00 4
2017-01-01 04:00:00 5
New group: 2017-01-03 00:00:00
data
index
2017-01-03 00:00:00 49
2017-01-03 01:00:00 50
2017-01-03 02:00:00 51
2017-01-03 03:00:00 52
2017-01-03 04:00:00 53
例如,计算平均值:
df.groupby(df.index.floor('72H')).mean()
data
index
2016-12-31 24.5
2017-01-03 73.0
另类
group = (df.index-df.index[0])//pd.Timedelta('72H')
df.groupby(group).mean()
使用的输入:
df = pd.DataFrame({'index': pd.date_range('2017-01-01', '2017-01-05', freq='1H'),
'data': np.arange(1, 98)}).set_index('index')
评论