Power Query:计算 1 天内和超过 1 天的 date/time 个实例,并将它们显示为百分比(系统实用时间百分比)

Power Query: Calculate date/time instances within and over 1 day and show them as percentages (system utility time %)

我有一些系统数据集,我想在其中找到两个系统(Uptimum + 洗涤器)之间的比较,它们在 24 小时内以及超过 24 小时内运行的百分比的实用时间 (%)。

数据集低于数据,但正如您所注意到的 - A 列(日期) 中有日期空缺,有些日子缺失,就像从不时。但是一天之内的系统实例也比较多(系统操作每天可以改变很多次),所以B栏有一个时间(时间column) 这样我就可以在一天内跟踪准确的操作时间。

这里没有正式的“结束时间”,它只是正在进行的过程,其中操作(系统)是 changing/shifting 以及许多其他参数。

我所做的是,我在 F 列 中提取了日期,以避免重复并按系统汇总它们(G2 和 H2 列), 使用下面这个函数你也可以看到下面的截图:

=SUMIFS(Explog2021_04_28[T];Explog2021_04_28[D];$F2;Explog2021_04_28[System];"<>"&G)-SUMIFS(Explog2021_04_28[T];Explog2021_04_28[D];$F2;Explog2021_04_28[System];G)+(INDEX(Explog2021_04_28[System];MATCH($F2;Explog2021_04_28[D]))=G)-(INDEX(Explog2021_04_28[System];MATCH($F2;Explog2021_04_28[D];0))<>G)*$B2

使用此函数,我使用日期和系统选项的提取值对 A 列和 B 列求和。

首先你会注意到我有负值作为百分比,它不应该在那里,是因为我的日期间隔太多了吗?有没有更好的方法来解决这个问题?正如你在图表上看到的那样,它看起来很糟糕...... 如果可能的话,这也不应超过总使用量的 100%。

您的每一个意见都会很棒。

如果我没有理解错的话,我相信下面的 Power Query 应该可以满足您的需求。

请阅读代码注释并逐步完成应用步骤 window 以了解算法。有问题就问,有逻辑错误就投诉

我假设系统总是处于 scrubberUptimum

M代码

let

//Read in data. Change table name in next line to reflect actual table name
    Source = Excel.CurrentWorkbook(){[Name="systemTable"]}[Content],

//Type the columns
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"D", type text}, {"T", type any}, {"System", type text}}),
    #"Changed Type with Locale" = Table.TransformColumnTypes(#"Changed Type", {{"D", type date}}, "en-150"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Changed Type with Locale",{{"T", type time}}),

//Combine date and time => datetime
    #"Added Custom" = Table.AddColumn(#"Changed Type1", "startTime", 
        each DateTime.From(Number.From([D]) + Number.From([T])), type datetime),

//create shifted column to be able to quickly refer to previous row
//this method much faster than using an Index column
    Base = #"Added Custom",
    ShiftedList = List.RemoveFirstN(Table.Column(Base, "startTime"),1) & {null},
    Custom1 = Table.ToColumns(Base) & {ShiftedList},
    Custom2 = Table.FromColumns(Custom1, Table.ColumnNames(Base) & {"endTime"}),
    #"Changed Type2" = Table.TransformColumnTypes(Custom2,{{"endTime", type datetime}}),

//Create a list of dates for each time span
    #"Added Custom1" = Table.AddColumn(#"Changed Type2", "datesList", each 
        let 
            st = DateTime.Date([startTime]),
            et = DateTime.Date([endTime] ),
            dur = Duration.TotalDays(et-st)
        in 
            if et=null then {st} else List.Dates(st,dur+1,#duration(1,0,0,0))),

//Expand the list so we have sequential dates (fill in the gaps)
    #"Expanded datesList" = Table.ExpandListColumn(#"Added Custom1", "datesList"),

//Remove unneeded columns
    #"Removed Columns" = Table.RemoveColumns(#"Expanded datesList",{"D", "T"}),

//change date list datatype to datetime for simpler calculation formula
    #"Changed Type3" = Table.TransformColumnTypes(#"Removed Columns",{{"datesList", type datetime}}),

//calculate hours in System each day
    #"Added Custom2" = Table.AddColumn(#"Changed Type3", "Hrs in Day", 
        each List.Min({Date.EndOfDay([datesList]),[endTime]}) - List.Max({[startTime],[datesList]}),Duration.Type),

//Remove unneeded columns
    #"Removed Columns1" = Table.RemoveColumns(#"Added Custom2",{"startTime", "endTime"}),

//change date list to dates for report
    #"Changed Type5" = Table.TransformColumnTypes(#"Removed Columns1",{{"datesList", type date}}),

//Group by Date and System to calculate percent time in system
    #"Grouped Rows" = Table.Group(#"Changed Type5", {"datesList", "System"}, {
        {"Sum", each List.Sum([Hrs in Day])/#duration(0,24,0,0), Percentage.Type}}),

//Pivot on System to generate final report
    #"Pivoted Column" = Table.Pivot(#"Grouped Rows", List.Distinct(#"Grouped Rows"[System]), "System", "Sum", List.Sum),

//Rename the datelist column
    #"Renamed Columns" = Table.RenameColumns(#"Pivoted Column",{{"datesList", "D"}})
in
    #"Renamed Columns"

数据

结果