如何在Power Query中自定义表格 动态生成能耗预测日期小时表
Power Query 动态生成当月剩余小时级能耗预测表方案
不用特意啃自定义表的M语法,用内置的列表生成、展开功能就能快速搭出动态更新的预测底表,每次刷新自动适配当月剩余天数,全程大部分操作可以点界面完成,不用全写代码。
步骤1:生成小时粒度的预测维度底表
新建一个空查询,把下面的M代码贴进去,代码会自动计算当前日期到当月最后一天的时间范围,拆解到小时粒度,同时自动对齐你历史表的核心维度字段:
let // 动态获取时间基准,无需手动改日期 当前日期 = Date.From(DateTime.LocalNow()), 当月末日 = Date.EndOfMonth(当前日期), // 生成剩余日期序列 剩余日期列表 = {当前日期..当月末日}, 日期维表 = Table.FromList(剩余日期列表, Splitter.SplitByNothing(), {"Date"}), // 给每个日期挂载0-23点的小时值,展开到小时粒度 追加小时列 = Table.AddColumn(日期维表, "Hour of the Day", each {0..23}), 小时级维表 = Table.ExpandListColumn(追加小时列, "Hour of the Day"), // 生成和历史表一致的星期字段,默认周一是一周第一天,和多数工厂的统计规则对齐 追加星期字段 = Table.AddColumn(小时级维表, "Day of the week = Dia Semana", each Date.DayOfWeek(_[Date], Day.Monday)), // 拉取历史表中所有电表编码,做笛卡尔积避免遗漏计量点 全量电表列表 = List.Distinct(历史能耗表[Energy Meter Code]), 追加点表编码列 = Table.AddColumn(追加星期字段, "Energy Meter Code", each 全量电表列表), 全量维度底表 = Table.ExpandListColumn(追加点表编码列, "Energy Meter Code"), // 统一字段类型,和历史表保持一致 格式修正 = Table.TransformColumnTypes(全量维度底表,{ {"Date", type date}, {"Hour of the Day", Int64.Type}, {"Day of the week = Dia Semana", Int64.Type}, {"Energy Meter Code", type text} }) in 格式修正
代码里的
历史能耗表替换成你自己导入的历史能耗查询名称即可,如果电表编码是数值格式,把对应字段的类型改成数字就行。
如果不想从当天开始算,想从次日开始算,把剩余日期列表 = {当前日期..当月末日}改成剩余日期列表 = {Date.AddDays(当前日期,1)..当月末日}就可以。
步骤2:匹配历史同维度平均能耗
这步几乎不用写代码,点界面操作就行:
- 选中历史能耗表,点击「分组依据」,分组字段选
Energy Meter Code、Day of the week = Dia Semana、Hour of the Day三个,聚合规则选「平均值」,聚合字段选Consumption (MWh),输出列命名为Consumption (MWh)即可 - 选中刚才做好的预测维度底表,点击「合并查询」,和上面生成的分组平均表按三个维度字段做左连接,把平均能耗值扩展到预测表里,这部分值就是你要的简单平均法预测能耗
步骤3:合并全量数据
选中历史能耗表,点击「追加查询」,把匹配完能耗值的预测表追加进去,就得到了从月初到月末完整的小时级能耗表,直接算累计值就能得到当月末的预测总能耗。
几个实用优化点
- 整个表是完全动态的,每次刷新会自动根据当天日期调整预测时间范围,跨月也不用手动改参数
- 如果历史数据里有停产、设备故障这类异常低能耗数据,可以在分组算平均之前先过滤掉异常值,预测结果会更贴合实际生产情况
- 如果要加节假日、排班这类维度,直接在维度底表里加对应判断列,分组的时候把新维度加进去就行,匹配逻辑不用改
内容的提问来源于stack exchange,提问作者Helio_Prado
相关产品推荐
相关产品推荐

