Power BI Power Query M时间序列数据空值线性插值简便实现问询
Power Query M 无自定义函数的线性插值实现方案
Power Query 原生未提供单步执行线性插值的界面功能,但可以通过内置能力组合实现,无需手动编写完整的插值逻辑函数,两种常用方案如下:
方案1:界面操作实现(适合单空值间隔场景)
- 提前确认数据已按「州、郡、时间列」升序排序,且每个分组内的时间序列间隔均匀(线性插值的前置要求)
- 选中需要处理的数值列,依次点击「转换」选项卡→「填充」→「向下」,生成向下填充后的列;再重复操作选择「填充」→「向上」,生成向上填充后的列
- 新增自定义列计算最终插值结果,公式为:
if [原始数值列] = null then ([向下填充列] + [向上填充列])/2 else [原始数值列] - 计算完成后删除中间生成的填充列即可
注意:该方案仅适用于空值不连续的场景,若存在连续多个空值请使用方案2
方案2:内置List.Interpolate函数实现(适配连续空值场景)
M语言原生内置List.Interpolate函数直接处理列表插值,仅需少量代码调用即可,无需自行实现插值计算逻辑:
- 按州、郡字段对数据分组,聚合方式选择「所有行」,生成分组后的子表列
- 对分组后的子表列应用转换,示例代码如下:
// 替换代码中对应中文为你实际的列名即可 = Table.TransformColumns( 上一步生成的分组表, {"分组生成的子表列名", (groupTable) => let sortedTable = Table.Sort(groupTable, {{"时间列名", Order.Ascending}}), // 对目标数值列做插值 interpolatedValues = List.Interpolate(sortedTable[目标数值列名], Table.RowCount(sortedTable)), // 替换原列的空值 outputTable = Table.FromColumns( Table.ToColumns(sortedTable) & {interpolatedValues}, Table.ColumnNames(sortedTable) & {"插值后列名"} ) in outputTable } )
- 展开处理后的子表列即可得到完整插值后的数据集
如果有多个数值列需要插值,只需循环对每个列调用
List.Interpolate生成对应的插值结果列即可,无需修改核心逻辑。
内容的提问来源于stack exchange,提问作者OJT
相关产品推荐
相关产品推荐

