我有一张表格,其中 A 列是日期,B 列是值。我想找到 B 中值的标准差,其中 A 中的日期在最近 30 天内。
我能够使用适用sumifs
于范围的 a 进行求和。stdev
适用于范围,但我需要一种方法来告诉它仅从 B 中选择符合条件的值,然后返回匹配列表...我认为也许filter
是正确的函数,但我似乎无法正确获取条件以返回我想要的内容。我认为类似A&">today()-30"
或某些东西适用于条件,但仅当它要求“标准”而不是“条件”时才有效。
答案1
实际上,可以使用函数解决此问题FILTER()
。假设您的数据存储在范围内A1:B62
,日期在列中A
,值在列中B
,第一行是标题,数据从 01/05/2023 到 30/06/2023。使用该FILTER()
函数的过程如下:
=FILTER($B$1:$B$62,$A$1:$A$62>=TODAY()-30)
首先,指定要返回的数组,即列中的值B
。第二部分指定要包含的值,即仅包含列中日期在最近 30 天内的值A
。在当前规范中,这包括“今天”的值,因此假设每天都有值,则返回 31 个值。如果您只想包含历史值,则可以按如下方式调整函数,以将其限制在上限:
=FILTER($B$1:$B$62,($A$1:$A$62>=TODAY()-30)*($A$1:$A$62<TODAY()))
使用此规范,您将返回与上述相同的值,但排除“今天”的值,因此假设所有日期都可用,则返回 30 天。附加约束是日期需要小于TODAY()
。
要计算标准差(SD),您只需将STDEV()
您选择的函数包装在过滤函数周围:
=STDEV(FILTER($B$1:$B$62,($A$1:$A$62>=TODAY()-30)*($A$1:$A$62<TODAY())))
上述程序的前提是,您只想计算过去 30 天的 SD 一次。一个可能更符合实际的例子是以移动方式计算 SD,作为逐行计算,始终考虑数据中可用的过去 30 个值(例如,考虑交易日或类似值)。可以使用函数解决此场景BYROW()
,其一般形式如下:
=BYROW(array, [function])
因此,我们需要指定要应用该函数的数组,并在 lambda 语句中指定该函数。在C2
上述假设下应用其基本规范(例如,单元格中的公式,因为它是一个数组公式)时,该过程如下所示:
=BYROW($B$2:$B$62,
LAMBDA(row,STDEV(OFFSET(row,,,-30))))
首先,我们指定要应用函数的数组,然后在 lambda 语句中定义该函数。假设我们想要对过去 30 天应用 SD 计算,我们OFFSET()
将给定行的高度设置为 -30 来捕获此值。
但是,当前的规范有两个错误:(i)#REF!
由于偏移量为 -30,前 29 行会出现错误;(ii) 第 30 行的 SD 计算仅包含 29 个值,因为第一行是标题,即文本单元格。因此,为了规避这些问题,我们可以调整公式,如下所示,包括 with IF()
andCOUNTIF()
语句IFERROR()
:
=BYROW($B$2:$B$62,
LAMBDA(row,IFERROR(IF(COUNTIF(OFFSET(row,,,-30),"*")>0,"",STDEV(OFFSET(row,,,-30))),"")))
前者处理计算 29 个值的标准差的问题,后者处理错误#REF!
。使用这种方法,您可以逐行计算过去 30 天的标准差。