如何在熊猫中创建具有偏移量的滚动时间窗口

时间:2019-06-26 19:58:47

标签: python pandas

我想对带偏移的时间窗口内的记录应用一些统计信息。我的数据看起来像这样:

                             lon        lat  stat  ...   speed  course  head
ts                                                 ...                      
2016-09-30 22:00:33.272  5.41463  53.173161    15  ...     0.0     0.0   511
2016-09-30 22:01:42.879  5.41459  53.173180    15  ...     0.0     0.0   511
2016-09-30 22:02:42.879  5.41461  53.173161    15  ...     0.0     0.0   511
2016-09-30 22:03:44.051  5.41464  53.173168    15  ...     0.0     0.0   511
2016-09-30 22:04:53.013  5.41462  53.173141    15  ...     0.0     0.0   511

[5 rows x 7 columns]

我需要600秒的时间范围内的记录,步长为300秒。例如,这些窗口:

start                     end
2016-09-30 22:00:00.000   2016-09-30 22:10:00.000
2016-09-30 22:05:00.000   2016-09-30 22:15:00.000
2016-09-30 22:10:00.000   2016-09-30 22:20:00.000

我看过熊猫rolling来做到这一点。但似乎它没有选择添加我上面描述的偏移量。我是否正在忽略某些内容,还是应该为此创建自定义功能?

1 个答案:

答案 0 :(得分:1)

DataFrame.resampleDataFrame.shift结合使用,可能会实现您想要的目标。

import pandas as pd

index = pd.date_range('1/1/2000', periods=9, freq='T')
series = pd.Series(range(9), index=index)
df = pd.DataFrame(series)

这将为您提供原始的时间序列(示例取自api文档DataFrame.resample)。

2000-01-01 00:00:00  0                                                                                                                                                                        
2000-01-01 00:01:00  1                                                                                                                                                                        
2000-01-01 00:02:00  2                                                                                                                                                                        
2000-01-01 00:03:00  3                                                                                                                                                                        
2000-01-01 00:04:00  4                                                                                                                                                                        
2000-01-01 00:05:00  5                                                                                                                                                                        
2000-01-01 00:06:00  6                                                                                                                                                                        
2000-01-01 00:07:00  7                                                                                                                                                                        
2000-01-01 00:08:00  8

现在按照您的 step 大小重新采样(请参见DataFrame.shift)。

sampled = df.resample('90s').sum()

这将为您提供 step 大小的不重叠窗口。

2000-01-01 00:00:00   1                                                                                                                                                                       
2000-01-01 00:01:30   2                                                                                                                                                                       
2000-01-01 00:03:00   7                                                                                                                                                                       
2000-01-01 00:04:30   5                                                                                                                                                                       
2000-01-01 00:06:00  13                                                                                                                                                                       
2000-01-01 00:07:30   8

最后,将采样的df移一级并将其与先前创建的df相加。窗口大小是步长大小的两倍有帮助。

sampled.shift(1, fill_value=0) + sampled

这将产生:

2000-01-01 00:00:00   1                                                                                                                                                                       
2000-01-01 00:01:30   3                                                                                                                                                                       
2000-01-01 00:03:00   9                                                                                                                                                                       
2000-01-01 00:04:30  12                                                                                                                                                                       
2000-01-01 00:06:00  18                                                                                                                                                                       
2000-01-01 00:07:30  21 

也许有一个更优雅的解决方案,但我希望这会有所帮助。