如何在熊猫中通过Dataframe.rolling选择具有特殊步骤的数据系列?

How to select data series with special steps by Dataframe.rolling in pandas?

提问人:forestbat 提问时间:10/30/2022 更新时间:10/30/2022 访问量:63

问:

我有一个数据帧,看起来像这样,索引是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.rollingDataSeries.rolling

python-3.x pandas dataframe datetime 选择

评论

0赞 Raibek 10/30/2022
所以滚动(“72H”)不起作用?
0赞 forestbat 10/30/2022
我看到了熊猫的文档,我认为 rolling('72H') 只能这样做:[1H,2H,3H......72H]、[2H、3H、4H......73H]。

答:

1赞 mozway 10/30/2022 #1

72 小时滚动可以通过以下方式实现(或任何其他功能df.rolling('72H').sum()sum)

但看起来你不想要一个,而是一个带地板groupbyrolling

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')