AverageIf移动平均线

时间:2017-10-02 18:53:17

标签: excel excel-formula moving-average

我正在尝试找到一个5年移动平均线,它取一年中的一个月的条件。 A列包含从2010年1月1日到今天当前日期的每日日期。 B列包含每日数量。基本上我想在5年的滚动期内平均1月份的所有日子。我可以轻松地将其作为静态数字,但此表将每天更新。

例如:

class Base
{
public:
    virtual void Method() = 0;
};

class Child : public Base
{
public:
    void Method() override;
};


// source.cpp

void Child::Method() override        // oops
{
    ...
}

等...

我写过这个公式:

Date        Quantity
1/1/2010    14,113
1/2/2010    15,364

这会返回=AVERAGEIFS(OFFSET(B2,COUNT(B2:B10000)-1826,0,1826,1),A2:A10000,MONTH(A2:A10000)=1)

2 个答案:

答案 0 :(得分:1)

您将无法使用AVERAGEIFS()。 AVERAGEIFS只进行简单的迭代,不进行转换。

在设置变量范围时,我更喜欢使用INDEX来获取范围,因为它不是Volatile。

此外,所有范围必须相同。因此,将B列限制为1826个单元但不限制A列到相同的1826个单元将导致第二个错误。

使用此数组公式:

=AVERAGE(IF(MONTH(INDEX(A:A,MATCH(1E+99,B:B)-1826):INDEX(A:A,MATCH(1E+99,B:B)))=1,INDEX(B:B,MATCH(1E+99,B:B)-1826):INDEX(B:B,MATCH(1E+99,B:B))))

作为一个数组公式,需要在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter来确认。

enter image description here

您也可以使用日期本身而不是硬编码的1826天。这将允许闰年。

=AVERAGE(IF(MONTH(INDEX(A:A,MATCH(DATE(YEAR(TODAY())-5,MONTH(TODAY()),DAY(TODAY())),A:A,0)):INDEX(A:A,MATCH(TODAY(),A:A)))=1,INDEX(B:B,MATCH(DATE(YEAR(TODAY())-5,MONTH(TODAY()),DAY(TODAY())),A:A,0)):INDEX(B:B,MATCH(TODAY(),A:A))))

答案 1 :(得分:1)

这是另一个选择

=AVERAGE(IF(A2:A5000>EDATE(TODAY(),-60),IF(MONTH(A2:A5000)=1,B2:B5000)))

使用 CTRL + SHIFT确认 + ENTER

这不会尝试查找特定范围的数据,只查看所有数据并平均过去5年和1月份的日期行。在查看所有行时会有一些额外的开销,但是您的数据量相对较少,所以我不希望这些数据很重要