Python中如何根据距离条件提取多个不连续的时间范围?
解决方法
核心思路是识别连续符合条件的行组,再对每个组提取首尾时间。用Pandas可以这样实现:
标记符合距离条件的行
新增一列is_important,标记该行是否属于重要事件范围:import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Timestamp': ['1s', '2s', '3s', '4s', '5s'], 'Dist from Each Other': [1000, 2000, 3000, 2000, 1000] }) # 标记符合条件的行 df['is_important'] = df['Dist from Each Other'].between(1000, 2000)为连续的符合条件行分配组ID
通过对比当前行和上一行的is_important状态,生成组ID,这样断开的区间会被分到不同组:# 计算状态变化的点,生成组ID df['group_id'] = (df['is_important'] != df['is_important'].shift()).cumsum()过滤并提取每个组的时间范围
只保留符合条件的组,然后按组分组取首尾时间,最后整理成需要的格式:# 筛选出重要事件的组,分组后提取首尾时间 result = df[df['is_important']].groupby('group_id').agg( start_time=('Timestamp', 'min'), end_time=('Timestamp', 'max') ) # 整理成"X-Y秒"的格式 result['time_range'] = result['start_time'].str.replace('s', '') + '-' + result['end_time'].str.replace('s', '') + '秒' # 输出结果 print(result['time_range'].tolist())
运行这段代码后,会得到预期结果:['1-2秒', '4-5秒']
原理说明:
between(1000,2000)直接标记符合距离区间的行;shift()对比当前行和上一行的状态,cumsum()给每一段连续的相同状态分配唯一ID,中间不符合条件的行(比如第3秒)会把前后的符合条件行分成不同组;- 最后分组取首尾时间,就能得到每个独立的重要事件时间范围。
内容的提问来源于stack exchange,提问作者Luke Fields
相关产品推荐
相关产品推荐

