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

pandas中如何合并start time、End time两列时间戳为单列

问题修正方案

你原来的melt写法有三个问题:

  • 没有指定要转置的列,默认会把所有不在id_vars里的列全部转为行数据,列多的时候会混入无关内容
  • 没有指定值列的名称,转出来的时间列不会自动命名为time
  • 没有做进程名和事件类型的拼接,自然得不到A_start/A_end这类格式的进程标签

正确实现代码

因为你的日志列很多,不需要手动枚举所有要保留的列,直接取两个时间列之外的全部列作为标识列即可,代码如下:

import pandas as pd

# 1. 宽表转长表,合并两个时间列为单列
df_long = df.melt(
    id_vars=df.columns.difference(["start time", "End time"]),
    value_vars=["start time", "End time"],
    var_name="time_type",
    value_name="time"
)

# 2. 拼接进程名和事件后缀
event_suffix_map = {"start time": "_start", "End time": "_end"}
df_long["process"] = df_long["process"] + df_long["time_type"].map(event_suffix_map)

# 3. 清理临时列,按ID、时间排序得到最终结果
df_result = df_long.drop(columns=["time_type"]).sort_values(by=["ID", "time"]).reset_index(drop=True)

说明

  • 这个写法会自动保留你所有非时间列的日志内容,不用手动逐个列名写到id_vars里,适配你列多的场景
  • 同一ID下存在多个同名进程也不会出现数据混乱,因为melt是按原始数据的每一行独立转置,每个原始进程条目会对应生成start、end两行数据,不会自动合并同名项
  • 如果你的时间列是字符串格式,后续要做时序计算可以再加一步df_result["time"] = pd.to_datetime(df_result["time"])转成时间类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:06:25