【问题标题】:Extract high and lows on monthly basis from Excel dataset从 Excel 数据集中每月提取高点和低点
【发布时间】:2017-12-02 04:26:22
【问题描述】:

我正在尝试从 Excel 中股票价格的一组每日高点、低点、收盘价数据中提取每个月的高点和低点。我该怎么做呢,我附上了一张电子表格的图片,展示了我的尝试。

【问题讨论】:

  • 您没有附加电子表格
  • 我不能,但我附上了一张图片,应该清楚

标签: excel


【解决方案1】:

为什么不只使用数据透视表并将数据透视字段聚合方法更改为高和低字段的最大值或最小值。

这是添加字段的示例图像(请原谅使用 Mac!)

结果

您不必在每个字段的 Max 和 Min 上加倍。我只是想证明这是可能的。

【讨论】:

    【解决方案2】:

    你想出的公式看起来是在正确的轨道上,但我会改为:

    = MAX(IF((MONTH($B$2:$B$100)=J2)*(YEAR($B$2:$B$100)=I2),$C$2:$C$100))
    

    然后根据需要将此公式向下拖动。

    (同样,要找到每个月的最小值,只需将上述等式中的 MAX 替换为 MIN。)

    注意这是一个数组公式,所以你必须在输入这个公式后按 Ctrl+Shift+Enter 而不是仅仅按 输入

    另外请注意,您应该在此公式中包含全部数据,而不仅仅是到 1 月底。在此示例中,我将其降至第 100 行,但您需要根据数据的结束位置对其进行调整。

    或者,如果您使用数据透视表,@QHarr 的解决方案也可以使用。


    编辑

    根据要求,以下是此公式中发生的情况:

    (MONTH($B$2:$B$100)=J2)(YEAR($B$2:$B$100)=I2) 都返回 TRUEFALSE 的垂直数组(大小相同)。当你将它们相乘时,你会得到一个由 1 和 0 组成的数组。 (此输出数组的索引将等于 1,其中输入数组的相应索引都等于 TRUE。)您实际上并没有将 MONTHYEAR 相乘。这将毫无意义,因为例如 2017 年 2 月,您将获得 4034 的值,这是没有意义的。

    将两个逻辑数组相乘的简单示例:{TRUE;TRUE;FALSE}*{TRUE;FALSE;TRUE} 将返回 {1;0;0}。您可能期望它应该返回{TRUE;FALSE;FALSE},但是当两个逻辑数组相乘时,它会自动转换为一个由 1 和 0 组成的数组。但是,这不是问题,因为 IF 语句将处理 1 和 0 的数组,就像处理 TRUEFALSE 的数组一样,因此无需转换它回到逻辑值。

    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 被替换为INDEX(K:K,ROW()-1)。仅键入K1 的问题在于,如果在第一行和第二行之间插入一行,则对K1 的引用不会改变,即使您希望它实际增加到K2。这可以通过INDEX(K:K,ROW()-1) 解决,它始终只引用其正上方K 列中的单元格,即使在工作表中插入了行。

    【讨论】:

    • 非常感谢这个优雅的公式,它完全符合我的要求。我试图了解它是如何工作的,但我有点困惑?数组公式中的 * 实际上意味着多个月份和年份(即 J2 和 I2)还是只是一个条件?我也对一个数组感兴趣,如果当前高点高于上个月的高点,则依次遍历每一行并输出 +1,如果低点低于上个月的低点则输出 -1,否则输出 0。如果您也能在这方面帮助我,将不胜感激?
    • @pvwhite01 再次查看我的帖子,我编辑了我的答案以解决您的问题。
    • 啊,现在完全有道理,我明白为什么要使用乘法,以便只有在两个条件都满足时才会产生 1,否则会产生零。在查看网络上从未向我解释过的数组公式和教程时,我非常感激。我应该对我的问题的第二部分更清楚。该公式需要逐行查看每日数据,如果每日最高点高于上月每日最高点,则输出+1,如果每日最低点低于上月每日最低点,则输出-1,否则输出0。再次感谢。
    • @pvwhite01 这将是相同的公式,只需将该公式中的所有K 实例替换为D(因为D 列是每日最高列)。
    • 这个公式不就是看当前高点和前一天的高点比较吗?如果当前高点高于上个月的高点,我正在寻找一个输出 +1 的公式。所以在上面的扫描中,第 20 行的日高是 1089.38。仅当该值高于上个月的高值(第 11 行中 1150.45 的 1 月高点)时才需要输出 +1,否则为 0。过去几个小时我一直在尝试,但似乎无法任何地方?再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多