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
相关产品推荐
相关产品推荐

