pandas。移除另一个系列的时间索引的时间间隔内的所有记录(即时间范围排除)。[英] pandas: Remove all rows within time interval of another series's time index (i.e. time range exclusion)

本文是小编为大家收集整理的关于pandas。移除另一个系列的时间索引的时间间隔内的所有记录(即时间范围排除)。的处理方法,想解了pandas。移除另一个系列的时间索引的时间间隔内的所有记录(即时间范围排除)。的问题怎么解决?pandas。移除另一个系列的时间索引的时间间隔内的所有记录(即时间范围排除)。问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

假设我有两个数据框:

#df1
time
2016-09-12 13:00:00.017    1.0
2016-09-12 13:00:03.233    1.0
2016-09-12 13:00:10.256    1.0
2016-09-12 13:00:19.605    1.0

#df2
time
2016-09-12 13:00:00.017    1.0
2016-09-12 13:00:00.233    0.0
2016-09-12 13:00:01.016    1.0
2016-09-12 13:00:01.505    0.0
2016-09-12 13:00:06.017    1.0
2016-09-12 13:00:07.233    0.0
2016-09-12 13:00:08.256    1.0
2016-09-12 13:00:19.705    0.0

我想删除 df2 中的所有行,这些行最多为 df1 中时间索引的 +1 秒,因此产生:

#result
time
2016-09-12 13:00:01.505    0.0
2016-09-12 13:00:06.017    1.0
2016-09-12 13:00:07.233    0.0
2016-09-12 13:00:08.256    1.0

最有效的方法是什么?我在 API 中看不到任何对时间范围排除有用的东西.

解决方案

你可以使用pd.merge_asof 这是一个以 0.19.0 开头的新包含,并且还接受一个容差参数以匹配指定时间量的 +/-间隔.

# Assuming time to be set as the index axis for both df's
df1.reset_index(inplace=True)
df2.reset_index(inplace=True)

df2.loc[pd.merge_asof(df2, df1, on='time', tolerance=pd.Timedelta('1s')).isnull().any(1)]

在此处输入图片描述

请注意,默认匹配是在向后方向进行的,这意味着选择发生在右侧DataFrame(df1)的最后一行,其"on"键(即"time") 小于或等于左键 (df2).因此,tolerance 参数仅在这个方向(向后)延伸,从而导致 - 范围的匹配.

0.20.0 这可以通过使用 direction='nearest' 参数并将其包含在函数调用中来实现.因此,tolerance 也得到了双向扩展,从而产生了 +/- 的带宽匹配范围.

本文地址:https://www.itbaoku.cn/post/1727975.html