如何基于共享Datetime列合并多个Pandas DataFrame?
合并多测量源带时间戳的DataFrame解决方案
核心思路
问题出在未按时间戳精确对齐:直接用concat(axis=1)会按行号而非时间戳合并,导致冗余行或多Datetime列;设索引后报错通常是索引类型不统一、存在重复索引或数据结构异常。以下是标准化解决步骤:
步骤1:统一时间戳格式
先确保所有DataFrame的Datetime列为datetime类型,避免字符串格式不一致导致索引对齐失败:
import pandas as pd # 转换每个DataFrame的时间戳列 df_a['Datetime'] = pd.to_datetime(df_a['Datetime']) df_b['Datetime'] = pd.to_datetime(df_b['Datetime']) df_c['Datetime'] = pd.to_datetime(df_c['Datetime'])
步骤2:处理重复时间戳(可选但关键)
若单个测量源存在重复时间戳,需先聚合或去重,否则合并时会出现索引冲突:
# 示例:对重复时间戳的行取均值,也可选择保留第一行/最后一行 df_a = df_a.groupby('Datetime').mean().reset_index() df_b = df_b.groupby('Datetime').first().reset_index()
步骤3:设置时间戳为索引
将Datetime设为每个DataFrame的索引,确保合并时按时间戳对齐:
df_a = df_a.set_index('Datetime') df_b = df_b.set_index('Datetime') df_c = df_c.set_index('Datetime')
步骤4:合并并区分测量源
给不同源的列加前缀避免重名,再用concat按列合并,可选择保留所有时间戳(join='outer')或仅保留共同时间戳(join='inner'):
# 给列名加前缀区分测量源 df_a = df_a.add_prefix('source_a_') df_b = df_b.add_prefix('source_b_') df_c = df_c.add_prefix('source_c_') # 合并DataFrame merged_df = pd.concat([df_a, df_b, df_c], axis=1, join='outer') # 可选:将时间戳从索引转回列 merged_df = merged_df.reset_index()
示例验证
假设输入数据:
DataFrame A:
Datetime Value1 2024-01-01 00:00:00 10 2024-01-01 00:05:00 12 DataFrame B:
Datetime Value2 2024-01-01 00:00:00 20 2024-01-01 00:10:00 25 DataFrame C:
Datetime Value3 2024-01-01 00:05:00 30 2024-01-01 00:10:00 35
执行上述步骤后,合并结果与预期一致:
| Datetime | source_a_Value1 | source_b_Value2 | source_c_Value3 |
|---|---|---|---|
| 2024-01-01 00:00:00 | 10 | 20 | NaN |
| 2024-01-01 00:05:00 | 12 | NaN | 30 |
| 2024-01-01 00:10:00 | NaN | 25 | 35 |
常见报错处理
- 设索引后concat报错:检查是否所有索引都是
datetime类型,或某个DataFrame处理后变为Series(需确保每个DataFrame至少保留一列数据)。 - 合并后出现重复行:检查各DataFrame是否存在未处理的重复时间戳,执行步骤2去重/聚合即可解决。
内容的提问来源于stack exchange,提问作者OpticalMagician
相关产品推荐
相关产品推荐

