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

How do I choose the minimum value from rows within certain hour range?

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

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

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

日期和时间 日期部分 小时 价格 最低
2018-01-0100:00 2018-01-01 00:00 258,86 258,86
2018-01-0101:00 2018-01-01 01:00 259,85 259,85
2018-01-0102:00 2018-01-01 02:00 256,6 256,6
2018-01-0103:00 2018-01-01 03:00 242,84 242,84
2018-01-0104:00 2018-01-01 04:00 243,23 243,23
2018-01-0105:00 2018-01-01 05:00 177,07 177,07
2018-01-0106:00 2018-01-01 06:00 174,8 177,07
2018-01-0107:00 2018-01-01 07:00 175 177,07
2018-01-0108:00 2018-01-01 08:00 194,27 177,07
2018-01-0109:00 2018-01-01 09:00 203,81 177,07
2018-01-0110:00 2018-01-01 10:00 243,43 177,07
2018-01-0111:00 2018-01-01 11:00 252,47 177,07
2018-01-0112:00 2018-01-01 12:00 236,84 177,07
2018-01-0113:00 2018-01-01 13:00 245,89 177,07
2018-01-0114:00 2018-01-01 14:00 253,75 177,07
2018-01-0115:00 2018-01-01 15:00 260,14 177,07
2018-01-0116:00 2018-01-01 16:00 265,75 177,07
2018-01-0117:00 2018-01-01 17:00 269,68 177,07
2018-01-0118:00 2018-01-01 18:00 268,3 177,07
2018-01-0119:00 2018-01-01 19:00 265,06 177,07
2018-01-0120:00 2018-01-01 20:00 262,5 177,07
2018-01-0121:00 2018-01-01 21:00 260,24 177,07
2018-01-0122:00 2018-01-01 22:00 256,5 256,5
2018-01-0123:00 2018-01-01 23:00 244,61 244,61
2018-01-0200:00 2018-01-02 00:00 248,54 248,54
2018-01-0201:00 2018-01-02 01:00 227,7 227,7
2018-01-0202:00 2018-01-02 02:00 243,62 243,62
2018-01-0203:00 2018-01-02 03:00 246,08 246,08
2018-01-0204:00 2018-01-02 04:00 252,96 252,96
2018-01-0205:00 2018-01-02 05:00 263,88 263,88
2018-01-0206:00 2018-01-02 06:00 273,32 227,7
2018-01-0207:00 2018-01-02 07:00 299,86 227,7
2018-01-0208:00 2018-01-02 08:00 313,92 227,7
2018-01-0209:00 2018-01-02 09:00 329,65 227,7
2018-01-0210:00 2018-01-02 10:00 344,5 227,7
2018-01-0211:00 2018-01-02 11:00 346,27 227,7
2018-01-0212:00 2018-01-02 12:00 339,78 227,7
2018-01-0213:00 2018-01-02 13:00 335,25 227,7
2018-01-0214:00 2018-01-02 14:00 353,74 227,7
2018-01-0215:00 2018-01-02 15:00 374,09 227,7
2018-01-0216:00 2018-01-02 16:00 409,68 227,7
2018-01-0217:00 2018-01-02 17:00 416,76 227,7
2018-01-0218:00 2018-01-02 18:00 371,53 227,7
2018-01-0219:00 2018-01-02 19:00 331,32 227,7
2018-01-0220:00 2018-01-02 20:00 303,6 227,7
2018-01-0221:00 2018-01-02 21:00 283,64 227,7
2018-01-0222:00 2018-01-02 22:00 275,18 275,18
2018-01-0223:00 2018-01-02 23:00 271,35 271,35

第一种方法 - 不稳定和惰性

您可以在 Lowest 列的第 2 行使用此公式 (其中 Lowest 在 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) )

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

在 Excel table (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 Table:

=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]) )

如果数据未排序,请使用这些公式之一。如果数据按示例所示排序,那么 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:$D/(($A:$A>=B2-1+TIME(22,0,0))*($A:$A<=B2+TIME(5,0,0))),1),D2)

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