如何从特定小时范围内的行中选择最小值?

Posted

技术标签:

【中文标题】如何从特定小时范围内的行中选择最小值?【英文标题】:How do I choose the minimum value from rows within certain hour range? 【发布时间】:2021-08-31 16:43:03 【问题描述】:

我每天每小时有一排。对于 06:00 到 21:00 小时,我需要使用 22:00(前一天)到 05:00 小时的列价格中找到的最低值(最小值),并将其存储在 06 小时每行的最低列中:00 至 21:00。其他列的低点将显示与价格相同的值。

最低列中的 Excel 公式应该如何解决这个问题?

我需要它的外观(以粗体显示的最小值)

Date & hour DatePart Hour Price Lowest
2018-01-01 00:00 2018-01-01 00:00 258,86 258,86
2018-01-01 01:00 2018-01-01 01:00 259,85 259,85
2018-01-01 02:00 2018-01-01 02:00 256,6 256,6
2018-01-01 03:00 2018-01-01 03:00 242,84 242,84
2018-01-01 04:00 2018-01-01 04:00 243,23 243,23
2018-01-01 05:00 2018-01-01 05:00 177,07 177,07
2018-01-01 06:00 2018-01-01 06:00 174,8 177,07
2018-01-01 07:00 2018-01-01 07:00 175 177,07
2018-01-01 08:00 2018-01-01 08:00 194,27 177,07
2018-01-01 09:00 2018-01-01 09:00 203,81 177,07
2018-01-01 10:00 2018-01-01 10:00 243,43 177,07
2018-01-01 11:00 2018-01-01 11:00 252,47 177,07
2018-01-01 12:00 2018-01-01 12:00 236,84 177,07
2018-01-01 13:00 2018-01-01 13:00 245,89 177,07
2018-01-01 14:00 2018-01-01 14:00 253,75 177,07
2018-01-01 15:00 2018-01-01 15:00 260,14 177,07
2018-01-01 16:00 2018-01-01 16:00 265,75 177,07
2018-01-01 17:00 2018-01-01 17:00 269,68 177,07
2018-01-01 18:00 2018-01-01 18:00 268,3 177,07
2018-01-01 19:00 2018-01-01 19:00 265,06 177,07
2018-01-01 20:00 2018-01-01 20:00 262,5 177,07
2018-01-01 21:00 2018-01-01 21:00 260,24 177,07
2018-01-01 22:00 2018-01-01 22:00 256,5 256,5
2018-01-01 23:00 2018-01-01 23:00 244,61 244,61
2018-01-02 00:00 2018-01-02 00:00 248,54 248,54
2018-01-02 01:00 2018-01-02 01:00 227,7 227,7
2018-01-02 02:00 2018-01-02 02:00 243,62 243,62
2018-01-02 03:00 2018-01-02 03:00 246,08 246,08
2018-01-02 04:00 2018-01-02 04:00 252,96 252,96
2018-01-02 05:00 2018-01-02 05:00 263,88 263,88
2018-01-02 06:00 2018-01-02 06:00 273,32 227,7
2018-01-02 07:00 2018-01-02 07:00 299,86 227,7
2018-01-02 08:00 2018-01-02 08:00 313,92 227,7
2018-01-02 09:00 2018-01-02 09:00 329,65 227,7
2018-01-02 10:00 2018-01-02 10:00 344,5 227,7
2018-01-02 11:00 2018-01-02 11:00 346,27 227,7
2018-01-02 12:00 2018-01-02 12:00 339,78 227,7
2018-01-02 13:00 2018-01-02 13:00 335,25 227,7
2018-01-02 14:00 2018-01-02 14:00 353,74 227,7
2018-01-02 15:00 2018-01-02 15:00 374,09 227,7
2018-01-02 16:00 2018-01-02 16:00 409,68 227,7
2018-01-02 17:00 2018-01-02 17:00 416,76 227,7
2018-01-02 18:00 2018-01-02 18:00 371,53 227,7
2018-01-02 19:00 2018-01-02 19:00 331,32 227,7
2018-01-02 20:00 2018-01-02 20:00 303,6 227,7
2018-01-02 21:00 2018-01-02 21:00 283,64 227,7
2018-01-02 22:00 2018-01-02 22:00 275,18 275,18
2018-01-02 23:00 2018-01-02 23:00 271,35 271,35

【问题讨论】:

你有office 365吗?您可以使用MINIFS 函数,将下限作为一个约束条件,将上限作为另一个约束条件,并提供可以调整限制的输入。 【参考方案1】:

第一种方法 - 易变和懒惰

您可以在 最低 列的第 2 行使用此公式(其中最低在 E 列中) 并复制下来:

=IF(C2=TIME(6,0,0), MIN(OFFSET(D2,-MIN(8,ROW()-1),0,MIN(8,ROW()-1),1)),
   IF( (C2 > TIME(6,0,0))*(C2 < TIME(22,0,0)), E1,
       D2) )

我把我的放在你的一边,称它为低,以测试是否达到了正确的答案,你的桌子从 A1 开始,如下所示:

在 Excel 表格 (ctrl t) 中,它更具可读性,如下所示:

=IF([@Hour]=TIME(6,0,0), MIN(OFFSET([@Price],-MIN(8,ROW()-1),0,MIN(8,ROW()-1),1)),
   IF( ([@Hour] > TIME(6,0,0))*([@Hour] < TIME(22,0,0)), E1,
        [@Price]) )

Craner 方法 - 非易失性和非惰性

这使用了 INDEX 而不是 Scott Craner 提出的 OFFSET - 应该使工作表更具响应性。

=IF(C2=TIME(6,0,0), MIN(INDEX(D:D,MAX(1,ROW()-8)):INDEX(D:D,ROW()-1)),
   IF( (C2 > TIME(6,0,0))*(C2 < TIME(22,0,0)), F1,
        D2) )

或在 Excel 表格中:

=IF([@Hour]=TIME(6,0,0), MIN(INDEX(D:D,MAX(1,ROW()-8)):INDEX(D:D,ROW()-1)),
   IF( ([@Hour] > TIME(6,0,0))*([@Hour] < TIME(22,0,0)), H1,
        [@Price]) )

【讨论】:

注意:我最初发布了一个错误的答案,然后删除并更正了 - 如果您选择了中间结果,很抱歉,但是这个已经被检查了。 是的 - 我想过索引,但很懒。 超级!那真是太好了。好的 - 将使用 alt soln 进行编辑。 首先,谢谢! Craner 方法就像普通工作表上的魅力一样。其次,当我在 Excel 表中使用它时,它只会得出 FALSE 的结论,因此不起作用。关于为什么不同的逻辑结果的任何线索? 酷! - 首先,@scott_craner 你值得称赞。想想你已经接近 128,015 点——我希望你没有为某事存钱。 ;-) 我可以看到它在 Lowest 中返回 FALSE 的唯一方法是它从 [@Price]H1。 H 恰好是我将公式放在我创建的 Excel 表中的列。如果您将公式复制到最低列并且表格从 A1 开始,则 H1 应更改为 E1。但是返回 FALSE 真的很奇怪。你能先检查一下吗?【参考方案2】:

如果数据未排序,请使用以下公式之一。如果数据按照示例所示进行排序,那么在大型数据集上使用 INDEX 版本的 Mark 公式会更快。

在 IF 中嵌套 MINIFS:

=IF(AND(C2>=TIME(6,0,0),C2<=TIME(21,0,0)),MINIFS(D:D,A:A,">="&B2-1+TIME(22,0,0),A:A,"<="&B2+TIME(5,0,0)),D2)


如果没有 MINIFS,我们可以使用 AGGREGATE:

=IF(AND(C2>=TIME(6,0,0),C2<=TIME(21,0,0)),AGGREGATE(15,7,$D$2:$D$49/(($A$2:$A$49>=B2-1+TIME(22,0,0))*($A$2:$A$49<=B2+TIME(5,0,0))),1),D2)

请注意,我们需要从完整的列引用转移到仅数据集。

【讨论】:

以上是关于如何从特定小时范围内的行中选择最小值?的主要内容,如果未能解决你的问题,请参考以下文章

SqlSever基础 MIN 查看一个表中具有特定内容的行中某一列的最小值

Pandas GroupBy 并选择特定列中具有最小值的行

在第一个元素在特定范围内的元组中查找元组列表中的最小值

大日期范围内的最小/最大日期值取决于值

如何从数组行中获取最小值

Mysql查询,范围内的最大值和最小值没有得到正确的输出