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

多索引DataFrame中使用asfreq('D')插值报错的解决方法

多索引DataFrame分组插值报错的解决方法

问题场景

先创建两个带日期索引的DataFrame:

import pandas as pd

frame1=pd.DataFrame({'dates':['2023-01-01','2023-01-07','2023-01-09'],'values':[0,18,28]})
frame1['dates']=pd.to_datetime(frame1['dates'])
frame1=frame1.set_index('dates')

frame2=pd.DataFrame({'dates':['2023-01-08','2023-01-12'],'values':[8,12]})
frame2['dates']=pd.to_datetime(frame2['dates'])
frame2=frame2.set_index('dates')

单独对每个DataFrame执行asfreq('D').interpolate()可以正常完成每日插值:

frame1.asfreq('D').interpolate()
frame2.asfreq('D').interpolate()

将两个DataFrame合并为['frame','dates']的多索引结构后:

frame1['frame']='f1'
frame2['frame']='f2'
concat=pd.concat([frame1,frame2])
concat=concat.set_index('frame',append=True)
concat=concat.reorder_levels(['frame','dates'])

尝试直接分组插值时触发TypeError:

concat.groupby('frame').apply(lambda g:g.asfreq('D').interpolate())

错误信息:

TypeError: Cannot convert input [('f1', Timestamp('2023-01-01 00:00:00'))] of type <class 'tuple'> to Timestamp

错误原因

groupby('frame')后返回的子组g仍保留原多索引(['frame','dates']),而asfreq('D')要求索引为单日期类型,无法识别元组格式的多索引值,因此报错。

解决方法

在apply的处理逻辑中,先移除子组里多余的frame索引层级,仅保留dates作为单索引执行插值,之后再恢复多索引结构:

result = concat.groupby('frame').apply(
    lambda g: g.reset_index(level='frame', drop=True).asfreq('D').interpolate()
).reset_index().set_index(['frame', 'dates'])

代码说明

  1. reset_index(level='frame', drop=True):移除子组中的frame索引层,只保留dates作为单索引,满足asfreq的要求
  2. 执行asfreq('D').interpolate()完成每日插值
  3. 最后通过reset_index().set_index(['frame', 'dates'])重新构建多索引,恢复原数据的层级结构

执行后即可得到每个分组内按日期补全并插值的结果。

内容的提问来源于stack exchange,提问作者principal-ideal-domain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:50:21