如何计算DataFrame中速度处于0≤speed≤5区间的连续时间段时长
没问题,我来帮你搞定这个需求!要找出0≤speed≤5的连续数据段并计算每个段的结束与开始时间差,咱们用Pandas就能轻松实现,步骤很清晰:
1. 先标记符合速度条件的行
首先给DataFrame里的每一行打个标签,标记它是否满足速度区间要求:
import pandas as pd # 用你提到的DataFrame名称c c['is_valid'] = c['speed'].between(0, 5, inclusive='both')
2. 为连续有效段创建分组ID
接下来要把连续的有效行(is_valid=True)归为同一个分组,这里用累积求和的技巧就能实现:当行的有效性状态变化时,分组ID会自动递增,这样连续的有效行就会拥有相同的ID:
# 找出状态变化的位置,累加得到分组ID c['group_id'] = (~c['is_valid']).cumsum() # 只筛选出有效分组的数据 valid_segments = c[c['is_valid']].groupby('group_id')
3. 计算每个连续段的时间差
现在对每个有效分组,提取最早的开始时间、最晚的结束时间,然后直接计算两者的差值:
# 聚合计算每个段的关键信息 segment_results = valid_segments.agg( start_time=('timestamp', 'min'), end_time=('timestamp', 'max'), duration=('timestamp', lambda x: x.max() - x.min()) ).reset_index(drop=True) # 查看最终结果 print(segment_results)
重要提示:
- 确保你的
timestamp列是datetime类型,如果目前还不是,先执行转换:
c['timestamp'] = pd.to_datetime(c['timestamp'])
- 结果里的
duration是timedelta类型,如果需要转换成秒、分钟这类数值格式,可以用:
# 转换成总秒数 segment_results['duration_seconds'] = segment_results['duration'].dt.total_seconds() # 转换成总分钟数 segment_results['duration_minutes'] = segment_results['duration'].dt.total_seconds() / 60
这样处理后,就能精准得到你需要的每个连续有效段的时间差啦,完全匹配你描述的场景——比如第一个段从索引1到7,第二个从9到14,都会被正确分组并计算时长。
内容的提问来源于stack exchange,提问作者Alastair New




