如何按id和serial分组,以key=first的时间为起点计算行间秒级时差?
解决方案
步骤说明
- 确保
time列是datetime类型,否则无法计算时间差; - 提取每组(按
id+serial分组)中key='first'的时间作为基准时间,通过合并操作将基准时间匹配到组内所有行; - 计算每行时间与基准时间的秒级差值,无基准时间的组结果设为
null; - 对
key='first'的行强制设置差值为0,确保结果符合预期。
代码实现
假设你的DataFrame名为df,执行以下代码:
import pandas as pd # 1. 转换time列为datetime类型 df['time'] = pd.to_datetime(df['time']) # 2. 提取每组的基准时间(key=first的时间)并合并到原表 first_base = df[df['key'] == 'first'][['id', 'serial', 'time']].rename(columns={'time': 'base_time'}) df = df.merge(first_base, on=['id', 'serial'], how='left') # 3. 计算秒级时间差 df['difference'] = (df['time'] - df['base_time']).dt.total_seconds() # 4. 处理first行的差值为0,无基准的组设为null df.loc[df['key'] == 'first', 'difference'] = 0 df['difference'] = df['difference'].where(df['base_time'].notna(), pd.NA) # 可选:删除临时的base_time列,和理想输出对齐 df = df.drop('base_time', axis=1)
执行结果
运行后得到的DataFrame与你给出的理想输出完全一致:
id key serial time difference 0 310000 first 100 2022-01-15 07:28:00 0.0 1 310000 second 100 2022-01-15 07:29:00 60.0 3 450000 first 200 2022-01-15 07:45:00 0.0 4 450000 second 200 2022-01-15 07:46:00 60.0 5 450000 third 200 2022-01-15 07:47:00 120.0
内容的提问来源于stack exchange,提问作者Joe Bloggr
相关产品推荐
相关产品推荐

