繁体   English   中英

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

[英]How to create a rolling time window with offset in 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

我看着熊猫滚动这样做。 但似乎它没有选择添加我上面描述的偏移量。 我是否正在忽略某些内容,还是应该为此创建自定义函数?

通过将DataFrame.resampleDataFrame.shift结合DataFrame.resample ,可以实现您想要的目标。

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

现在按照长重新采样(请参阅DataFrame.shift )。

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

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

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 

可能会有更优雅的解决方案,但我希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM