根据 Power Query 中传感器读数之间的差距对日期时间事件进行分组
Group datetime events based on gap between sensor readings in Power Query
有人知道如何使用 Power Query 根据前一个日期时间读数与当前日期时间读数之间的差距对传感器事件进行分组吗?抱歉,我不确定如何表达这个问题,这可能就是我没有运气 Google.
的原因
我想做的是根据当前读数和之前读数之间的差距,按开始和结束日期时间对一些数据进行分组。
如果您考虑以下数据:
这样分组很容易:
但这实际上是两个离散事件,而不是一个 - 如果您注意到 10:00 和 13:00 之间的差距,我假设这些事件需要在两个小时内分组彼此喜欢:
编辑 - 所以,要明确一点,如果读数发生在上次读数两个多小时之后,那么它可以被视为一个新事件。
在 Power Query 中是否有有效的解决方案?正如您可能想象的那样,当涉及到日期时间读数和传感器时,有大量数据。
我可以并且愿意(并且确实)在其他情况下编写代码来执行此操作,但此报告已经通过 Power Query 按最小和最大日期时间分组,因此如果我可以添加,工作量会少得多那里有额外的时间截止组逻辑。
感谢您的帮助!
菲尔.
编辑 - 我看到了一个解决方案,您可以添加一个索引并减去日期来为日期(而不是日期时间)创建岛组,但我认为(尽管我可能是错的)这行不通这里是因为读数不是以完全固定的间隔进行的(它们可能是每 1 小时 2 分钟或每 58 分钟等)。
看看这是否有帮助。是的,我正在使用索引
创建岛屿群
将每行上方的行合并到相邻的列中
取两列之间的时长
添加索引
如果持续时间 > 2 则放入索引
往下填
按索引分组并取 min/max
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
// stolen from Imke Feldman via Ron Rosenfeld, great way to combine list next to itself, offset
shiftedList = {null} & List.RemoveLastN(Source[Reading Datetime],1),
custom1 = Table.ToColumns(Source) & {shiftedList},
custom2 = Table.FromColumns(custom1,Table.ColumnNames(Source) & {"Previous Row"}),
#"Added Index" = Table.AddIndexColumn(custom2, "Index", 0, 1),
// copy over index when duration > 2 hours between columns
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each if [Previous Row]=null then [Index] else if Number.From([Reading Datetime]-[Previous Row])*24 >2 then [Index] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Grouped Rows" = Table.Group(#"Filled Down", {"Custom"}, {{"Reading Start Datetime", each List.Min([Reading Datetime]), type datetime}, {"Reading End Datetime", each List.Max([Reading Datetime]), type datetime}}),
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Custom"})
in #"Removed Columns"
有人知道如何使用 Power Query 根据前一个日期时间读数与当前日期时间读数之间的差距对传感器事件进行分组吗?抱歉,我不确定如何表达这个问题,这可能就是我没有运气 Google.
的原因我想做的是根据当前读数和之前读数之间的差距,按开始和结束日期时间对一些数据进行分组。
如果您考虑以下数据:
这样分组很容易:
但这实际上是两个离散事件,而不是一个 - 如果您注意到 10:00 和 13:00 之间的差距,我假设这些事件需要在两个小时内分组彼此喜欢:
编辑 - 所以,要明确一点,如果读数发生在上次读数两个多小时之后,那么它可以被视为一个新事件。
在 Power Query 中是否有有效的解决方案?正如您可能想象的那样,当涉及到日期时间读数和传感器时,有大量数据。
我可以并且愿意(并且确实)在其他情况下编写代码来执行此操作,但此报告已经通过 Power Query 按最小和最大日期时间分组,因此如果我可以添加,工作量会少得多那里有额外的时间截止组逻辑。
感谢您的帮助!
菲尔.
编辑 - 我看到了一个解决方案,您可以添加一个索引并减去日期来为日期(而不是日期时间)创建岛组,但我认为(尽管我可能是错的)这行不通这里是因为读数不是以完全固定的间隔进行的(它们可能是每 1 小时 2 分钟或每 58 分钟等)。
看看这是否有帮助。是的,我正在使用索引
创建岛屿群将每行上方的行合并到相邻的列中
取两列之间的时长
添加索引
如果持续时间 > 2 则放入索引
往下填
按索引分组并取 min/max
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
// stolen from Imke Feldman via Ron Rosenfeld, great way to combine list next to itself, offset
shiftedList = {null} & List.RemoveLastN(Source[Reading Datetime],1),
custom1 = Table.ToColumns(Source) & {shiftedList},
custom2 = Table.FromColumns(custom1,Table.ColumnNames(Source) & {"Previous Row"}),
#"Added Index" = Table.AddIndexColumn(custom2, "Index", 0, 1),
// copy over index when duration > 2 hours between columns
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each if [Previous Row]=null then [Index] else if Number.From([Reading Datetime]-[Previous Row])*24 >2 then [Index] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Grouped Rows" = Table.Group(#"Filled Down", {"Custom"}, {{"Reading Start Datetime", each List.Min([Reading Datetime]), type datetime}, {"Reading End Datetime", each List.Max([Reading Datetime]), type datetime}}),
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Custom"})
in #"Removed Columns"