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

如何在Pandas中计算车辆静止时段的Delta时间累计值?

解决Pandas中车辆静止时段累计delta计算问题

核心思路:先识别连续的静止/行驶时段,再对每个静止时段计算delta的累计和,最后将结果映射回原DataFrame,非静止时段填充指定值(-1或NaN)。


1. 构造示例数据

先模拟符合需求的DataFrame:

import pandas as pd

data = {
    'id': [1,1,1,1,1,1,2,2,2,2],
    'time': pd.date_range('2024-01-01 00:00:00', periods=10, freq='10S'),
    'value': [0,0,50,0,0,0,60,0,0,70],
    'delta': [10,10,10,10,10,10,10,10,10,10]
}
df = pd.DataFrame(data)

原数据示例:

id time value delta
0 1 2024-01-01 00:00:00 0 10
1 1 2024-01-01 00:00:10 0 10
2 1 2024-01-01 00:00:20 50 10
3 1 2024-01-01 00:00:30 0 10
4 1 2024-01-01 00:00:40 0 10
5 1 2024-01-01 00:00:50 0 10
6 2 2024-01-01 00:01:00 60 10
7 2 2024-01-01 00:01:10 0 10
8 2 2024-01-01 00:01:20 0 10
9 2 2024-01-01 00:01:30 70 10


2. 识别连续静止/行驶时段

按id分组,给每个连续的相同状态(静止/行驶)分配唯一分组键:

# 标记当前行是否为静止状态
df['is_stopped'] = df['value'] == 0

# 对每个id,生成连续状态的分组键:当当前行状态与上一行不同时,分组键+1
df['group_key'] = df.groupby('id')['is_stopped'].apply(lambda x: x.ne(x.shift()).cumsum())

3. 计算每个静止时段的累计delta

计算每个分组的delta总和,仅保留静止组的结果,非静止组填充指定值:

# 计算每个id+group_key组的delta总和
grouped_sum = df.groupby(['id', 'group_key'])['delta'].sum().reset_index(name='cum_delta')

# 静止组保留累计值,行驶组设为-1(若要NaN则替换为pd.NA)
grouped_sum['cum_delta'] = grouped_sum.apply(
    lambda row: row['cum_delta'] 
    if df[(df['id'] == row['id']) & (df['group_key'] == row['group_key'])]['is_stopped'].iloc[0] 
    else -1,
    axis=1
)

4. 合并结果到原DataFrame

将计算好的累计值映射回原数据,删除辅助列:

# 合并到原DataFrame
df = df.merge(grouped_sum, on=['id', 'group_key'], how='left')

# 删除中间辅助列
df = df.drop(['is_stopped', 'group_key'], axis=1)

最终结果:

id time value delta cum_delta
0 1 2024-01-01 00:00:00 0 10 20
1 1 2024-01-01 00:00:10 0 10 20
2 1 2024-01-01 00:00:20 50 10 -1
3 1 2024-01-01 00:00:30 0 10 30
4 1 2024-01-01 00:00:40 0 10 30
5 1 2024-01-01 00:00:50 0 10 30
6 2 2024-01-01 00:01:00 60 10 -1
7 2 2024-01-01 00:01:10 0 10 20
8 2 2024-01-01 00:01:20 0 10 20
9 2 2024-01-01 00:01:30 70 10 -1


关键说明

  • 必须按id分组,避免不同车辆的时段被混算
  • group_key的生成是识别连续相同状态的常用技巧,利用shift()对比前后行状态,cumsum()生成分组标识
  • 合并时使用left join,保证原数据的行顺序和完整性

内容的提问来源于stack exchange,提问作者user3599600

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:55:58