从Excel数据集中提取每月的高点和低点
我试图从Excel的一个股票价格每日高,低,closures数据集中每月提取高点和低点几年。 我将如何去做,我附上了一个电子表格图像显示我的尝试。
你提出的公式看起来像你在正确的轨道上,但我会改变这个:
= MAX(IF((MONTH($B$2:$B$100)=J2)*(YEAR($B$2:$B$100)=I2),$C$2:$C$100))
然后尽可能拖下这个公式。
(同样,为了find每个月的最小值,只需用MIN
代替上面等式中的MIN
。)
请注意,这是一个数组公式,因此您必须在input此公式之后按Ctrl + Shift + Enter键 ,而不是按Enter键 。
另外请注意,您应该在这个公式中包含您的全部数据,而不仅仅是一月底。 在这个例子中,我把它放到第100行,但是你需要根据你的数据结束的地方来调整它。
或者如果你使用的是Pivot Tables,@QHarr的解决scheme也可以。
编辑
按照要求,这个公式是这样的:
(MONTH($B$2:$B$100)=J2)
和(YEAR($B$2:$B$100)=I2)
返回TRUE
和FALSE
的垂直数组(大小相同)。 当你把它们放在一起时,你会得到一个1和0的数组。 (这个输出数组的索引将等于1,其中input数组的相应索引都等于TRUE
。实际上, MONTH
和YEAR
并不相乘。 这是毫无意义的,因为例如2017年2月,你会得到4034的值,这是没有意义的。
将两个逻辑数组相乘的简单示例: {TRUE;TRUE;FALSE}*{TRUE;FALSE;TRUE}
将返回{1;0;0}
。 您可能期望它应该返回{TRUE;FALSE;FALSE}
但是当乘以两个逻辑数组时,它会自动转换为1和0的数组。 然而,这不是一个问题,因为IF
语句将处理一个1和0的数组,就像处理一个TRUE
和FALSE
的数组一样,所以不需要将它转换回逻辑值。
AND
不起作用的原因是AND
总是返回单个结果(不是数组)。 例如, AND({TRUE;TRUE;FALSE},{TRUE;FALSE;TRUE})
只会返回FALSE
。 正因为如此, AND
在数组公式中通常不是很有用,因为它不会返回数组哈哈。
至于返回+1,-1或0取决于它与前一个月相比,这是相当容易完成。
由于输出是在K
列,我将基于此。
在单元格L2
中键入公式(并根据需要向下拖动):
= IF(K2>K1,"+1",IF(K2<K1,"-1","0"))
这个公式工作正常, 除非你插入行,那么它可能搞砸公式,这就是为什么我通常喜欢做下面这样的事情。 (它增加了更多的公式,但是“更安全”):
= IF(K2>INDEX(K:K,ROW()-1),"+1",IF(K2<INDEX(K:K,ROW()-1),"-1","0"))
您会注意到这些公式是相同的,只是在上面的公式中, K1
被replace为INDEX(K:K,ROW()-1)
。 刚刚键入K1
的问题是,如果在第一行和第二行之间插入一行,对K1
的引用不会改变,即使您希望它实际上增加到K2
。 这是用INDEX(K:K,ROW()-1)
来解决的,即使在表格中插入行,它总是只引用其上方K
列中的单元格。
为什么不只是使用一个数据透视表,并将高位字段和低位字段的数据透视表聚合方法更改为最大值或最小值。
这是一个示例图像(原谅使用Mac!)添加字段
和结果
您不必在每个字段的最大和最小值上翻倍。 我只是想表明这是可能的。