如何使用pandas将3个时间戳列合并为单一时间戳列
Pandas宽表转长表实现方案
你可以直接用pandas内置的melt方法完成需求,完整实现逻辑如下:
前置处理
如果你的数据表中null是字符串格式,先统一转成pandas可识别的空值:
import pandas as pd # 示例数据构造,你实际使用时替换成自己的df即可 df = pd.DataFrame({ 'ID': [1,2,3], 'j_date_created': ['23.03.2021 07:34:34', '23.03.2021 07:34:34', '23.03.2021 07:34:34'], 'j_date_completed': ['23.03.2021 07:34:36', '23.03.2021 07:34:37', pd.NA], 'j_date_rejected': [pd.NA, pd.NA, '04.04.2021 17:48:06'] }) # 字符串null转空值(如果你的数据里是字符串null的话执行这行) df = df.replace('null', pd.NA)
核心转换逻辑
# 宽表转长表 res = df.melt( id_vars=['ID'], # 保留不动的主键列 value_vars=['j_date_created', 'j_date_completed', 'j_date_rejected'], # 需要展开的时间列 var_name='Activity', # 存储原列名的字段名 value_name='timestamp' # 存储时间值的字段名 ) # 提取Activity类型,去掉前缀j_date_ # 如果pandas版本低于1.4,可替换为res['Activity'] = res['Activity'].str.replace('j_date_', '', regex=False) res['Activity'] = res['Activity'].str.removeprefix('j_date_') # 删除时间为空的无效行 res = res.dropna(subset=['timestamp']) # 按ID排序,和期望输出顺序保持一致 res = res.sort_values(by=['ID', 'Activity'], ignore_index=True)
执行完成后res就是你需要的最终格式。
内容的提问来源于stack exchange,提问作者Alde Joshua Wibowo
相关产品推荐
相关产品推荐

