如何用df_2的InitialDate和EndDate扩展df_1的id时间序列?
实现方案
以下是基于Pandas的可行实现步骤,确保保留时间的秒级粒度:
1. 确保日期字段为秒级datetime类型
先将两个DataFrame中的日期字段转换为datetime类型,明确保留秒级精度(如果原始数据格式固定,指定format参数可提升转换效率):
import pandas as pd # 转换df_1的时间字段 df_1['TrackDateTime'] = pd.to_datetime(df_1['TrackDateTime'], format='%Y-%m-%d %H:%M:%S') # 转换df_2的时间字段 df_2['InitialDate'] = pd.to_datetime(df_2['InitialDate'], format='%Y-%m-%d %H:%M:%S') df_2['EndDate'] = pd.to_datetime(df_2['EndDate'], format='%Y-%m-%d %H:%M:%S')
2. 转换df_2为与df_1一致的结构
使用melt函数将df_2的InitialDate和EndDate列转为行记录,并对应设置IdOrder值:
# 重塑df_2,生成对应记录 df_2_transformed = df_2.melt( id_vars=['id'], value_vars=['InitialDate', 'EndDate'], var_name='DateType', value_name='TrackDateTime' ) # 映射IdOrder值 df_2_transformed['IdOrder'] = df_2_transformed['DateType'].replace({ 'InitialDate': 0, 'EndDate': -1 }) # 清理冗余列 df_2_transformed = df_2_transformed.drop(columns=['DateType'])
3. 合并数据并整理
将转换后的df_2数据与原df_1合并,可选按id和IdOrder排序以优化记录顺序:
# 合并两个DataFrame final_df = pd.concat([df_1, df_2_transformed], ignore_index=True) # 可选:按id分组,按IdOrder降序排列(让初始日期记录排在结束日期前) final_df = final_df.sort_values(by=['id', 'IdOrder'], ascending=[True, False]).reset_index(drop=True)
可选:仅保留df_1中存在的id记录
如果不需要df_2中未出现在df_1的id数据,可在转换前先过滤:
# 过滤出df_1中存在的id df_2_filtered = df_2[df_2['id'].isin(df_1['id'].unique())] # 后续转换步骤使用df_2_filtered即可
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

