Pandas按时间戳差筛选1秒内同价格行失效问题求助
我明白你遇到的问题了——在旧版本的pandas(0.22.0)里,有些新版本的语法可能不兼容,导致之前的方法失效。咱们一步步来解决这个需求:
适配pandas 0.22.0的解决方案
1. 先把时间戳转成可计算的datetime类型
首先得确保你的timestamp列是pandas的datetime格式,不然没法正确计算时间差:
import pandas as pd # 假设你的DataFrame名为df df['timestamp'] = pd.to_datetime(df['timestamp'])
2. 计算相邻行的时间差与价格匹配条件
用shift()方法获取下一行的时间戳和价格,然后计算两行的时间差(转成秒),同时判断价格是否相同:
# 获取下一行的时间戳和价格 next_timestamp = df['timestamp'].shift(-1) next_price = df['price'].shift(-1) # 计算时间差的总秒数,同时排除最后一行(因为它没有下一行) time_diff_seconds = (next_timestamp - df['timestamp']).dt.total_seconds() # 构建筛选条件:时间差≤1秒、价格与下一行相同 match_mask = (time_diff_seconds <= 1) & (time_diff_seconds > 0) & (df['price'] == next_price)
3. 筛选出所有符合条件的行
这里要注意:符合要求的行包括当前满足条件的行和对应的下一行,所以我们需要把这两类索引合并后筛选:
# 获取当前满足条件的行的索引 current_match_indices = df[match_mask].index # 对应的下一行索引就是当前索引+1 next_match_indices = current_match_indices + 1 # 合并所有需要保留的索引,并排序 all_match_indices = current_match_indices.union(next_match_indices) # 得到最终结果 result_df = df.loc[all_match_indices].sort_index()
针对你提供的示例数据测试
假设你的示例中第6行的时间戳实际是2018-04-29 13:17:08.999(和第5行差0.668秒),那么运行后会选中第5、6两行——这两行满足时间差在1秒内且价格相同。
为什么旧版本可能失效?
有些新版本的写法(比如直接用df.diff()处理时间列后取dt.seconds)在pandas 0.22里可能有问题,因为dt.seconds只会返回时间差的秒部分,不会计算分钟/小时的差值,而dt.total_seconds()是正确计算总秒数的方法,在0.22版本中是支持的。
内容的提问来源于stack exchange,提问作者user3605780
相关产品推荐
相关产品推荐

