Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/pandas/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas进行滚动窗口计算,以便每1分钟计算一个新值_Python_Pandas_Rolling Computation - Fatal编程技术网

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

Python 如何使用pandas进行滚动窗口计算,以便每1分钟计算一个新值,python,pandas,rolling-computation,Python,Pandas,Rolling Computation,我有一个DataFrame,有3000多行,如下所示: 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

我有一个
DataFrame
,有3000多行,如下所示:

                                    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”
计算一个值,就像(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\u ms
    值从
    15:43
    15:47
  • 第二个和(
    300041
    )基于
    rr\u ms
    值,从
    15:44
    15:48
等等


                            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
...

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

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

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
你可以看到总数一直到最后一分钟都受到影响。如果要将其影响到第一个,只需移动索引:

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

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

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
你可以看到总数一直到最后一分钟都受到影响。如果要将其影响到第一个,只需移动索引:

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

您发布了
df.rolling('5T').sum()的结果,但所需的输出是什么?@ipg我刚刚添加了预期的结果。根据前5分钟收集的值计算第一个总和。第二个总和是根据在第1分钟到第6分钟之间收集的数据计算的,依此类推。您发布了
df.rolling('5T').sum()
的结果,但所需的输出是什么?@ipg我刚刚添加了预期的结果。根据前5分钟收集的值计算第一个总和。第二个总和是根据在第1分钟到第6分钟之间收集的数据计算的,依此类推。谢谢。
df.重采样('1T')
是否将数据分为1分钟的窗口(即,结果是第一分钟
rr_ms
的总和)?@MarielleDado:AFAIK是的。这与样本数据的结果是一致的。好吧,不完全是我想要的。我希望将数据分为5分钟的窗口,以便以1分钟为增量计算新值。我还希望窗口将“滑动”,以便每个值与前面的值“共享”大约4分钟的数据点。我认为你的解决方案每1分钟总结出一个新值,与其他值无关。有点难以解释,这就是为什么我包括解释我想如何打开窗口behave@MarielleDado:好的,
resample('1T')
将数据分割成1分钟的窗口,然后
滚动('5T')。sum()
计算连续5分钟和每分钟的滚动总和。因此,在两次操作之后,两个相邻的行确实共享了4分钟的数据。只需在更大的样品上试用,您就会看到。谢谢。
df.重采样('1T')
是否将数据分为1分钟的窗口(即,结果是第一分钟
rr_ms
的总和)?@MarielleDado:AFAIK是的。这与样本数据的结果是一致的。好吧,不完全是我想要的。我希望将数据分为5分钟的窗口,以便以1分钟为增量计算新值。我还希望窗口将“滑动”,以便每个值与前面的值“共享”大约4分钟的数据点。我认为你的解决方案每1分钟总结出一个新值,与其他值无关。有点难以解释,这就是为什么我包括解释我想如何打开窗口behave@MarielleDado:好的,
resample('1T')
将数据分割成1分钟的窗口,然后
滚动('5T')。sum()
计算连续5分钟和每分钟的滚动总和。因此,在两次操作之后,两个相邻的行确实共享了4分钟的数据。只需在更大的样品上试用,您就会看到。