如何从特定小时范围内的行中选择最小值?
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)
请注意,我们需要从完整的列引用转移到仅数据集。
【讨论】:
以上是关于如何从特定小时范围内的行中选择最小值?的主要内容,如果未能解决你的问题,请参考以下文章