如何合并格式相同但索引范围不同的多个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索引的关键!你之前堆叠时索引被忽略,大概率是不小心设成了Truesort=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
相关产品推荐
相关产品推荐

