如何在Python DataFrame中结合时长检测骑行者的制动过程?
骑行行程制动行为检测方案
针对你的行程数据,我们可以通过时间窗口内的速度降幅分析来检测制动行为,核心思路是在每个行程的时间线中,检查是否存在某段时间(如6秒)内速度下降至少30%的情况。以下是具体实现步骤:
1. 数据预处理
首先清理无效数据并构建行程时间线:
import pandas as pd # 读取数据(假设已加载到df中) # df = pd.read_csv("your_trip_data.csv") # 过滤速度为NaN的无效行(如行程起始的占位行) df = df.dropna(subset=["speed Km/h"]) # 按行程分组,计算每个阶段的累计时间(从行程开始到该阶段结束的总时长) df["cumulative_time"] = df.groupby("tripId")["duration (s)"].cumsum()
2. 制动行为检测逻辑
使用时间滚动窗口计算每个阶段前N秒内的最大速度,判断当前速度是否低于该最大速度的70%(即降幅≥30%):
def detect_braking(group, threshold_time=6, speed_drop_pct=30): speed_ratio = 1 - speed_drop_pct / 100 # 对应30%降幅的阈值比例(0.7) # 基于累计时间创建时间索引,用于滚动窗口计算 group["time"] = pd.to_datetime(group["cumulative_time"], unit="s") group = group.set_index("time") # 滚动窗口计算前threshold_time秒内的最大速度(排除当前阶段) group["max_prev_speed"] = group["speed Km/h"].rolling(f"{threshold_time}s").max().shift(1) # 判断当前阶段是否发生制动:当前速度 ≤ 前N秒最大速度 × 降幅比例 group["has_braking"] = group["speed Km/h"] <= group["max_prev_speed"] * speed_ratio group["has_braking"] = group["has_braking"].fillna(False) # 无前置数据时标记为False # 标记整个行程是否存在制动行为 group["trip_has_braking"] = group["has_braking"].any() # 恢复原索引结构 group = group.reset_index(drop=True) return group # 应用检测逻辑到每个行程 result_df = df.groupby("tripId").apply(detect_braking).reset_index(drop=True)
3. 结果说明
has_braking:标记单个阶段是否属于制动过程的一部分trip_has_braking:标记整个行程是否发生过制动行为
可调整参数
threshold_time:触发制动判定的最大时间窗口(默认6秒),可根据需求修改speed_drop_pct:触发制动的最小速度降幅(默认30%)
注意事项
- 若行程仅包含一个阶段,无法检测到制动行为,
trip_has_braking会标记为False - 滚动窗口会自动处理阶段时长不一致的问题,确保只统计指定时间范围内的速度变化
内容的提问来源于stack exchange,提问作者MayaGina
相关产品推荐
相关产品推荐

