合并两个时间序列DataFrame以获取无重复且包含所有唯一日期的有序结果
合并两个时间序列DataFrame以获取无重复且包含所有唯一日期的有序结果
我明白你想要的是一个包含两个DataFrame所有唯一日期、没有重复条目,并且严格按日期顺序排列的结果。你用pd.concat()的思路方向是对的,但确实缺少了去重和排序这两个关键步骤,所以才会出现重复日期和乱序的问题。
下面给你两种高效的解决方案,根据你的场景选择即可:
方法一:合并后去重+排序(最简洁,适合公共日期数据一致的场景)
因为你的两个DataFrame中,公共日期对应的Temp值是完全一致的,所以直接合并后去除重复日期,再排序就可以得到想要的结果:
import pandas as pd # 你的原始数据 df1 = pd.DataFrame({'Date': [pd.to_datetime('1980-01-03'), pd.to_datetime('1980-01-04'), pd.to_datetime('1980-01-05'), pd.to_datetime('1980-01-06'), pd.to_datetime('1980-01-07'), pd.to_datetime('1980-01-08')], 'Temp': [13.5,10,14,12,10,9]}) df2 = pd.DataFrame({'Date': [pd.to_datetime('1980-01-01'), pd.to_datetime('1980-01-02'), pd.to_datetime('1980-01-03'), pd.to_datetime('1980-01-04')], 'Temp': [10,17,13.5,10]}) # 核心步骤:合并 → 按日期去重 → 按日期排序 → 重置索引 merged_df = pd.concat([df1, df2]) \ .drop_duplicates(subset='Date') \ .sort_values('Date') \ .reset_index(drop=True) print(merged_df)
关键代码解释:
drop_duplicates(subset='Date'):指定按Date列去重,保留每个日期第一次出现的条目(因为你的公共日期数据一致,所以不管保留哪个都没问题;如果后续遇到公共日期数据不同的情况,可以通过keep参数调整,比如keep='last'保留最后一个)sort_values('Date'):将结果按日期从小到大排序,保证时间序列的顺序reset_index(drop=True):重置索引为连续的0开始的序列,让结果更整洁
方法二:外连接合并(更灵活,适合公共日期数据可能不同的场景)
如果后续你的两个DataFrame中,同一日期可能出现不同的Temp值,用外连接的方式可以更灵活地处理这种冲突:
import pandas as pd # 原始数据同上,省略 # 核心步骤:外连接合并 → 合并Temp列 → 整理列并排序 merged_df = pd.merge(df1, df2, on='Date', how='outer') # 合并Temp列:优先用df1的Temp值,为空则用df2的(可根据需求调整顺序) merged_df['Temp'] = merged_df['Temp_x'].combine_first(merged_df['Temp_y']) # 保留需要的列、排序并重置索引 merged_df = merged_df[['Date', 'Temp']].sort_values('Date').reset_index(drop=True) print(merged_df)
关键代码解释:
pd.merge(..., how='outer'):外连接会保留两个DataFrame的所有日期,公共日期会生成Temp_x(来自df1)和Temp_y(来自df2)两列combine_first():可以优雅地合并两列的值,优先取第一列的非空值,第一列为空时用第二列的值,适合处理数据冲突
两种方法最终都会输出你想要的结果:
Date Temp 0 1980-01-01 10.0 1 1980-01-02 17.0 2 1980-01-03 13.5 3 1980-01-04 10.0 4 1980-01-05 14.0 5 1980-01-06 12.0 6 1980-01-07 10.0 7 1980-01-08 9.0
备注:内容来源于stack exchange,提问作者Sayantan4796
相关产品推荐
相关产品推荐

