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

