查找 X 小时内的最大值和时间戳值

查找 X 小时内的最大值和时间戳值

我想使用 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 中具有最小值的行:

在此处输入图片描述

单击“分组依据”上的“确定”,然后单击“主页>关闭并加载”后,我们得到了正确的结果:

在此处输入图片描述

答案2

在此处输入图片描述

怎么运行的:

  • 单元格 W2 中的数组(CSE)公式:

    {=MAX(IF((T$2:T$11>=V2)*(T$2:T$11<=V2+TIME(2,0,0)),U$2:U$11,0))}
    
  • 完成配方Ctrl+Shift+Enter& 向下填充。

  • 单元格 X2 中的查找公式:

    =IFERROR(INDEX(T$2:T$11,MATCH(W2,U$2:U$11,0)),"")

根据需要调整公式中的单元格引用。

相关内容