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

Pandas计算特定行间时间差 新增Delta列存T到C状态时间间隔

问题说明

我的DataFrame对象d的构造代码如下:

import pandas as pd
d=pd.DataFrame(columns=['Status','t'])

d['Status']=['A','T', 'A','C','C','A','T','A','C','A']
d['t']= pd.to_datetime(['2021-06-12 08:39:24.813000',
'2021-06-12 08:39:24.820000',
'2021-06-12 08:39:25.210000',
'2021-06-12 08:39:25.217000',
'2021-06-12 08:44:28.830000',
'2021-06-12 10:48:10.293000',
'2021-06-12 10:48:10.300000',
'2021-06-12 10:48:10.680000',
'2021-06-12 10:48:10.693000',
'2021-06-12 10:48:11.223000'])

需求:新增名为Delta的列,计算每组成对的"T"(Trigger,触发)状态行与后续对应的第一个"C"(结束)状态行之间的时间差值,最终效果参考附图:
预期效果参考

实现方法

核心逻辑是先给每个触发的T分配唯一组ID,将组ID向前填充覆盖T之后、下一个T之前的所有行,再匹配每个组内第一个出现的C和对应T的时间做差即可。
完整实现代码:

import numpy as np

# 遇到T则组号+1,生成连续的组ID
d['trigger_group'] = d['Status'].eq('T').cumsum()
# 向前填充组ID,让T之后的行带上对应T的组标识
d['trigger_group'] = d['trigger_group'].ffill()

# 提取每个组对应的T触发时间
trigger_time = d[d['Status'] == 'T'].set_index('trigger_group')['t']
d['t_trigger'] = d['trigger_group'].map(trigger_time)

# 标记每个组内C的出现顺序,仅取第一个C计算时间差
d['c_seq'] = d[d['Status'] == 'C'].groupby('trigger_group').cumcount()
d['Delta'] = np.where(
    (d['Status'] == 'C') & (d['c_seq'] == 0),
    d['t'] - d['t_trigger'],
    pd.NaT
)

# 删除临时辅助列
d = d.drop(columns=['trigger_group', 't_trigger', 'c_seq'])

运行结果和参考图完全一致:

  • 第一组T(索引1)对应第一个C(索引3),Delta值为0 days 00:00:00.397000
  • 第二组T(索引6)对应第一个C(索引8),Delta值为0 days 00:00:00.393000
  • 其余非配对C、T、A状态行的Delta均为空值

如果需要将差值转为毫秒数值格式,可以把计算Delta的代码替换为:

d['Delta'] = np.where(
    (d['Status'] == 'C') & (d['c_seq'] == 0),
    (d['t'] - d['t_trigger']).dt.total_seconds() * 1000,
    np.nan
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:03:41