如何基于时间索引拼接不同频率DataFrame并填充NaN?
解决15分钟与小时频率DataFrame按索引拼接并填充NaN的问题
核心解决方案
你不需要对小时数据做插值,直接通过**索引重匹配(reindex)**就能实现需求,步骤如下:
验证索引类型与唯一性
首先确保两个DataFrame的索引都是datetime64类型,且无重复值(这是你之前concat报错的核心原因):# 检查索引类型 print(df_15min.index.dtype) print(df_hourly.index.dtype) # 检查索引是否唯一 print(df_15min.index.is_unique) print(df_hourly.index.is_unique)如果索引不是datetime类型,先转换:
df_15min.index = pd.to_datetime(df_15min.index) df_hourly.index = pd.to_datetime(df_hourly.index)如果有重复索引,需要先去重(比如保留第一个值):
df_15min = df_15min[~df_15min.index.duplicated(keep='first')] df_hourly = df_hourly[~df_hourly.index.duplicated(keep='first')]对小时数据重匹配到15分钟索引
用15分钟DataFrame的索引作为目标,对小时数据执行reindex,非整点的行自动填充NaN:df_hourly_reindexed = df_hourly.reindex(df_15min.index)合并两个DataFrame
用concat或join合并,保留15分钟索引:# 方法1:concat result = pd.concat([df_15min, df_hourly_reindexed], axis=1) # 方法2:join(更简洁) result = df_15min.join(df_hourly_reindexed)
为什么之前的方法失败?
concat报错:因为其中一个DataFrame存在重复索引,导致无法对齐,先处理重复索引即可解决。merge/join未得到预期结果:可能是你没有先对小时数据做重索引,直接合并时只会匹配到整点的行,非整点行不会被保留(内连接)或小时数据列全为NaN(外连接但索引未对齐)。
关于插值的疑问
不需要插值,插值是用来填充数值(比如线性插值、向前填充),而你需求是缺失行留NaN,reindex完全可以满足,且更符合需求。
内容的提问来源于stack exchange,提问作者SebastianGrove
相关产品推荐
相关产品推荐

