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 以了解算法。有问题就问,有逻辑错误就投诉
我假设系统总是处于 scrubber
或 Uptimum
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"
数据
结果
我有一些系统数据集,我想在其中找到两个系统(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 以了解算法。有问题就问,有逻辑错误就投诉
我假设系统总是处于 scrubber
或 Uptimum
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"
数据
结果