You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算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

火山引擎 最新活动