我想使用 Excel 的 Max 函数返回从我的开始时间起 2 小时内数字范围内的最大数字,然后返回最大值发生的确切时间。
我计算出了时间戳和2小时之后的最大值。
=MAXIFS($B:$B,$A:$A,"<="&D2+TIME(2,0,0),$A:$A,">="&D2)
=MAXIFS($B:$B,$A:$A,"<="&D3+TIME(2,0,0),$A:$A,">="&D3)
etc.
但是,我很难找到这个最大值发生的日期值时间戳(F 列)(在 2 小时窗口内)。我尝试了 Index/match,但它没有返回最大值发生的 2 小时窗口中的时间戳(它返回的时间戳与 2 小时窗口之外的那些数字相对应)。有什么想法吗?
这是我尝试过的 Index Match 公式,当到达 F6 时会中断
=INDEX($A:$A,MATCH(E6,$B:$B,0))
我相信它需要与 MAXIFS 公式相同的逻辑,以便它仅匹配 B 列上的值,使得它们对应的时间戳(A 列)位于{D 列,D 列 + 2 小时} 的时间戳内
谢谢!
答案1
您可以使用 FILTER 函数执行此操作。
我重新创建了您的部分数据,并将两个数据集格式化为表格。我还将允许的小时数差异放在单元格 E1 中,并将该单元格命名为 within_hours。
为了使事情简单化,我添加了一个名为“LatestAllowableTime”的列,它有以下公式:
=[@Timevalue]+TIME(within_hours,0,0)
要获取开始和允许结束之间的最大值,正如您所说的那样 - 使用 MAXIFS。
=MAXIFS(dataset1[Value],dataset1[Timevalue],"<=" & [@LatestAllowedTime],dataset1[Timevalue],">=" & [@Timevalue])
您可以使用 FILTER 函数根据某些条件过滤数据集 1。要在 FILTER 函数的第二个参数中使用多个 AND 条件,请将每个条件括在括号中,并在它们之间放置一个星号。因此,基于 MaxValueWithinXHours 列中的值从数据集 1 获取时间值的过滤器是:
=FILTER(dataset1[Timevalue],(dataset1[Value]=[@MaxValueWithinXHours])*(dataset1[Timevalue]<=[@LatestAllowedTime])*(dataset1[Timevalue]>=[@Timevalue]))
您会注意到,对于值 = 91,会显示 #SPILL! 消息。这是因为开始时间和结束时间之间有超过 1 行具有该值。在我的屏幕截图中,这些行显示为绿色。
因此,要选择其中一个时间值,我们可以使用 MIN 或 MAX。从您的屏幕截图来看,您需要 MIN(即时间最早的 2 小时内包含 91 的行):
=MIN(FILTER(dataset1[Timevalue],(dataset1[Value]=[@MaxValueWithinXHours])*(dataset1[Timevalue]<=[@LatestAllowedTime])*(dataset1[Timevalue]>=[@Timevalue])))
我认为就这样了。
编辑:
使用 PowerQuery 可能会获得更好的性能。为每个表创建两个连接 - 数据集 1(要从中返回值的列表)和数据集 2(要为其返回值的列表)。对于数据集 2,我只保留了上面原始屏幕截图中的前两列。要创建查询,请选择表中的单元格,然后选择“数据 > 获取和转换 > 来自表/范围”。
对于查询数据集 2,我添加了一个索引列,以便更容易看到发生了什么。在 Power Query 编辑器中,我选择“添加列 > 索引列”来执行此操作。然后我将该索引列移到左侧。这给了我这个:
确保所有日期/时间列的类型正确后,我向数据集 2 添加了自定义列,配置如下:
公式:
let x = [StartTime], y = [LatestAllowedTime] in Table.SelectRows(dataset1,each[TimeValue] >= x and [TimeValue] <= y)
Table.SelectRows 很容易找到,但棘手的部分需要挖掘(最终我得到了提示这里) 是我必须将 dataset2 中当前行的值存储在变量中,然后才能在 Table.SelectRows 函数中使用它们。
此公式的思路是使用当前行的值来过滤并返回数据集 1 中的一组行,这些行的 Timevalue 介于 StartTime 和 LatestAllowedTime 之间。实际上,我花了一段时间才弄清楚,但这是一个学习经历!
扩展公式返回的行后,我得到了以下结果:
进展顺利!终于将数据集 1 中的正确行放入查询中。
接下来,从 dataset2 中的每个索引中获取最大值。
为此,我复制了数据集 2,并将其命名为数据集 2_grouped。然后,我使用“Transform”选项卡中的 Group By,配置如下:
这给了我这个结果:
这些是正确的最大值。现在我只需要获取正确的数据集 1[TimeValue]。为此,我只需使用“主页 > 合并查询 > 将查询合并为新查询”,配置如下:
删除我们不需要的“dataset2_grouped”列后的结果:
最后一步是从每个索引中获取 dataset1rows.TimeValue 中具有最小值的行:
单击“分组依据”上的“确定”,然后单击“主页>关闭并加载”后,我们得到了正确的结果: