如何用Power Query合并含重复表头的多子表并新增城市列?
Power Query 整合多城市天气数据方案
以下是纯Power Query的分步实现方法,无需依赖Excel公式:
步骤1:导入原始数据到Power Query
将包含所有子表的原始数据导入Power Query(可通过数据>自表格/区域或对应数据源导入)。导入后你会看到包含重复表头、城市行、数据行和空白行的原始表格。
步骤2:添加索引列与标记城市起始行
- 点击添加列>索引列>从1开始,生成一个从1递增的索引列,用于定位每个城市块的起始位置。
- 添加自定义列,标记每个城市块的第一行(即包含城市名和预报时间的行):
- 点击添加列>自定义列,输入公式:
not isblank([Column1]) and Text.Contains([Column2]?, "Hourly Forecast") - 将该列命名为
IsCityRow,结果为true的行就是每个城市块的起始行。
- 点击添加列>自定义列,输入公式:
步骤3:生成城市块分组ID
添加另一个自定义列,为每个城市块分配唯一的分组ID:
- 自定义列公式:
List.Count(List.Select(Table.FirstN(#"Marked City Rows", [Index]), (x)=>x[IsCityRow])) - 命名为
GroupID,同一城市块内的所有行(包括城市行、表头行、数据行、空白行)会拥有相同的GroupID。
步骤4:按分组ID处理每个城市块
点击转换>分组依据,设置:
- 分组依据:
GroupID - 新增列1:名称
CityName,操作首行,列选择原始数据的第一列(如Column1) - 新增列2:名称
ForecastTime,操作首行,列选择原始数据的第二列(如Column2) - 新增列3:名称
DataRows,操作所有行,然后点击高级编辑器,将该列的代码修改为:
这段代码的作用是:跳过当前组的前两行(城市行和列标题行),移除最后一行空白行,然后将剩余行的第一行设为表头。each Table.Skip(_, 2) |> Table.RemoveLastN(1) |> Table.PromoteHeaders([PromoteAllScalars=true])
步骤5:展开数据并整理列
- 点击
DataRows列右侧的展开按钮,选择所有列进行展开。 - 调整列顺序,将
CityName和ForecastTime移到表格最前面,方便查看。 - 最后检查数据,过滤掉可能残留的空值或无效行(如果有的话)。
关键说明
- 若原始数据的列名不是
Column1/Column2,需替换为实际列名。 - 若每个城市块的数据行数不是360行,
Table.RemoveLastN(1)仍适用,因为它只移除最后一行空白行,无需硬编码行数。 - 此方法自动识别每个城市块的边界,无需手动拆分表格。
内容的提问来源于stack exchange,提问作者MJC
相关产品推荐
相关产品推荐

