You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:57:34