如何在Excel Power Query中提取时间序列进程的前一日运行状态
Power Query 实现进程前日状态匹配与启停识别方案
前置处理:修正澳式日期格式
首先要确保日期列被正确识别,避免日/月位置颠倒:
- 导入原始数据后,选中Date列,在「转换」选项卡选择「数据类型:日期」,如果识别错误,直接用自定义公式转换:
= Date.From([Date], "en-AU"),指定澳大利亚区域解析d/m/yyyy格式的日期。
核心实现步骤(全通用,适配任意数量进程)
方案:按进程分组后移位匹配前序状态(性能最优,避免笛卡尔积)
- 按进程分组:选中
Process列,点击「转换」-「分组依据」,配置如下:- 分组依据:Process
- 新列名:
ProcessDailyData - 操作:所有行
- 处理单个进程的每日数据:添加自定义列,输入M代码处理每个进程的子表:
= Table.AddColumn(#"替换为上一步的步骤名称", "ProcessedData", (each) => let // 子表按日期升序排序 Sorted = Table.Sort([ProcessDailyData],{{"Date", Order.Ascending}}), // 添加上一行的日期和在线状态 AddPrev = Table.Shift(Sorted, {{"IsOnline", 1, "IsOnlinePrev"}, {"Date", 1, "DatePrev"}}), // 校验上一行是否为前一天,避免日期断档导致匹配错误 AddValidPrevStatus = Table.AddColumn(AddPrev, "IsOnlineYesterday", each if [DatePrev] = Date.AddDays([Date], -1) then [IsOnlinePrev] else null) in AddValidPrevStatus )
兼容提示:如果你的Power Query版本不支持
Table.Shift函数,可用索引列方案替换移位逻辑:// 替换上述AddPrev部分的代码即可 AddIndex = Table.AddIndexColumn(Sorted, "Index", 0, 1, Int64.Type), AddPrev = Table.AddColumn(AddIndex, "PrevRow", each try AddIndex{[Index]-1} otherwise null), ExpandPrev = Table.ExpandRecordColumn(AddPrev, "PrevRow", {"IsOnline", "Date"}, {"IsOnlinePrev", "DatePrev"})
- 展开数据:删除原始
ProcessDailyData列,点击ProcessedData列右上角的展开按钮,选择需要保留的字段(Date、Process、IsOnline、IsOnlineYesterday)即可。 - 添加启停状态标识:新增自定义列
Status,输入公式:
= if [IsOnlineYesterday] = true and [IsOnline] = false then "关停" else if [IsOnlineYesterday] = false and [IsOnline] = true then "重启" else null
筛选掉Status列为空的行,即可直接得到每日所有关停/重启的进程清单。
后续使用
加载到Excel后,可直接基于结果表做数据透视:
- 行/列维度可选日期、周、月(可通过日期字段自动分组实现)
- 值维度统计进程数量,即可得到任意时间段的关停、重启进程统计。
示例运行结果(对应测试数据)
| Date | Process | IsOnline | IsOnlineYesterday | Status |
|---|---|---|---|---|
| 3/1/2020 | aaa | false | true | 关停 |
| 4/1/2020 | bbb | false | true | 关停 |
| 5/1/2020 | bbb | true | false | 重启 |
| 6/1/2020 | aaa | true | false | 重启 |
内容的提问来源于stack exchange,提问作者stevearama
相关产品推荐
相关产品推荐

