如何使用pandas进行滚动窗口计算,以便每1分钟计算一个新值

2024-04-26 04:10:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含3000多行的DataFrame,看起来像这样:

                                    rr_ms
time    
2020-03-05 15:43:51.122000+01:00    961
2020-03-05 15:43:52.112000+01:00    946
2020-03-05 15:43:53.131000+01:00    907
2020-03-05 15:43:54.424000+01:00    952
2020-03-05 15:43:54.424000+01:00    968
2020-03-05 15:43:55.298000+01:00    1019
2020-03-05 15:43:56.133000+01:00    1011
2020-03-05 15:43:57.121000+01:00    0
2020-03-05 15:43:58.142000+01:00    1020
2020-03-05 15:43:59.099000+01:00    999
2020-03-05 15:44:00.120000+01:00    948
2020-03-05 15:44:01.441000+01:00    922
2020-03-05 15:44:02.312000+01:00    873
2020-03-05 15:44:02.312000+01:00    899
2020-03-05 15:44:03.184000+01:00    933
2020-03-05 15:44:04.143000+01:00    948
2020-03-05 15:44:05.132000+01:00    986
2020-03-05 15:44:06.124000+01:00    982
2020-03-05 15:44:07.112000+01:00    972
2020-03-05 15:44:08.402000+01:00    0
2020-03-05 15:44:09.363000+01:00    990
2020-03-05 15:44:09.363000+01:00    1069
2020-03-05 15:44:10.233000+01:00    988
2020-03-05 15:44:11.133000+01:00    940
2020-03-05 15:44:12.122000+01:00    870
2020-03-05 15:44:13.112000+01:00    859
2020-03-05 15:44:14.073000+01:00    885
...

我想使用"rr_ms"计算一个值,就像this figure的(b)所示:

  • "rr_ms"被分割成5分钟的窗口,增量为1分钟
  • 这意味着与相邻的5分钟段大约有4分钟的重叠,因此每分钟计算一个新值
  • 这也意味着第一个值出现在5分钟标记处

我想也许pandas.rolling()会给我我想要的结果,但我认为它的行为不像我想的那样

IN: df.rolling('5T').sum()

OUT:
                                    rr_ms
time    
2020-03-05 15:43:51.122000+01:00    961.0
2020-03-05 15:43:52.112000+01:00    1907.0
2020-03-05 15:43:53.131000+01:00    2814.0
2020-03-05 15:43:54.424000+01:00    3766.0
2020-03-05 15:43:54.424000+01:00    4734.0
...     ...

期望的结果是这样的

  • 注意,在原始df中,第一个时间戳位于15:43
  • 这意味着第一个和(249022)是基于rr_ms计算的 从15:4315:47的值
  • 第二个和(300041)基于从15:4415:48rr_ms

等等


                            rr_ms
time    
2020-03-05 15:48:00+01:00   249022
2020-03-05 15:49:00+01:00   300041
2020-03-05 15:50:00+01:00   299396
...

我想知道我应该用什么样的函数来代替


Tags: in标记dataframepandasdftimerrout
1条回答
网友
1楼 · 发布于 2024-04-26 04:10:38

您应该首先以1分钟的频率重新采样。从那时起,您将能够使用一个简单的rolling和:

resul = df.resample('1T').sum().rolling('5T').sum()

样本数据将给出:

                       rr_ms
time                        
2020-03-05 14:43:00   8783.0
2020-03-05 14:44:00  23847.0

你可以看到总数一直到最后一分钟都受到影响。如果您想将其影响到第一个索引,只需shift索引:

resul.index = resul.index = resul.index - pd.Timedelta('4min')

相关问题 更多 >