我想对带偏移的时间窗口内的记录应用一些统计信息。我的数据看起来像这样:
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来做到这一点。但似乎它没有选择添加我上面描述的偏移量。我是否正在忽略某些内容,还是应该为此创建自定义功能?
答案 0 :(得分:1)
将DataFrame.resample
与DataFrame.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
也许有一个更优雅的解决方案,但我希望这会有所帮助。