You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并格式相同但索引范围不同的多个Pandas DataFrame

合并多个带Datetime索引的Pandas DataFrame

嘿,咱们来解决多个带Datetime索引的Pandas DataFrame合并的问题!看你已经搞定两个的情况了,批量合并其实也没那么复杂,我给你梳理几个最实用的方法:

方法一:按行堆叠(整合所有时间片段)

如果你的每个DataFrame是同一份指标的不同时间片段(比如一个覆盖2000-2004,另一个覆盖2001-2004),想要合并成一个包含所有时间点的大DF,pandas.concat() 是最省心的选择,它会自动处理索引对齐,缺失值补NaN:

import pandas as pd

# 先把所有要合并的DataFrame放进一个列表里,比如 dfs = [df1, df2, df3, ...]
dfs = [df1, df2, df3]

# 核心合并代码
merged_df = pd.concat(dfs, axis=0, ignore_index=False, sort=True)

# 可选:如果多个DF有重复的时间索引行,去重保留第一行
merged_df = merged_df[~merged_df.index.duplicated(keep='first')]

关键参数说明:

  • ignore_index=False:这是保留datetime索引的关键!你之前堆叠时索引被忽略,大概率是不小心设成了True
  • sort=True:合并后自动按时间索引排序,结果更规整
  • axis=0:按行堆叠(默认值,也可以省略)

方法二:按列合并(对齐时间索引生成宽表)

如果你的每个DataFrame是不同数据源的同结构数据(比如不同站点的同一指标),想要按时间索引对齐合并成宽表,只需要把axis改成1:

# 按列合并,保留所有时间点
merged_df = pd.concat(dfs, axis=1, join='outer', sort=True)

# 进阶:给每个数据源的列加后缀,方便区分
merged_df = pd.concat(dfs, axis=1, join='outer', sort=True, keys=['站点A', '站点B', '站点C'])
merged_df.columns = merged_df.columns.map('_'.join)

参数说明:

  • join='outer':保留所有DF的时间点(如果用'inner'则只保留所有DF共有的时间点)
  • keys参数:给每个DF的列加上前缀,避免列名重复混淆

为什么之前用merge没成功?

merge默认是按列名匹配,而非索引匹配,所以你需要手动指定按索引合并才行。如果一定要用merge批量处理,可以结合functools.reduce,但显然concat更简单:

from functools import reduce

# 按索引外连接合并多个DF
merged_df = reduce(lambda left, right: pd.merge(left, right, left_index=True, right_index=True, how='outer'), dfs)

额外小技巧:找到时间跨度最长的DF

你提到不清楚哪个DF的时间范围最广,可以用这段代码快速定位:

# 计算每个DF的时间跨度,并存入列表
df_time_spans = []
for name, df in zip(['df1', 'df2', 'df3'], dfs):
    span = df.index.max() - df.index.min()
    df_time_spans.append((span, name))

# 找到跨度最长的DF
longest_df = max(df_time_spans, key=lambda x: x[0])[1]
print(f"时间跨度最长的DataFrame是:{longest_df}")

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:07:44