对于缺少数据的日期,请取最近日期的值的平均值

时间:2016-05-02 20:51:24

标签: excel if-statement

我偶尔会收集流氮水平的数据。对于无法获得氮水平的日期,我希望我可以使用Excel公式,通过计算两个最近日期的氮水平平均值来估算该值。注意氮与流量(或其他水质)无关参数)并没有趋势所以我不能使用回归方程来估计值。

以下是A,B和C列以及行1(标题)到7的表格示例.B列包含实际数据(请注意,为了便于说明,我插入了“无值”) 。 C列是我想要计算的。因为我有数千行数据,所以不能手动输入这些公式中的每一个。

日期_______实际值______期望计算

1/1/2012 _______ 0.15 __________ = B2

1/2/2012 _____ [没有价值] _______ = AVERAGE(B2,B5)

2012年3月3日_____ [无价值] _______ = AVERAGE(B2,B5)

2012/1/4 _______ 0.17 __________ = B5

1/5/2012 _____ [无价值] _______ = AVERAGE(B5,B7)

1/6/2012 _______ 0.23 __________ = B7

1 个答案:

答案 0 :(得分:0)

=IF(B1<>"",B1,VLOOKUP(MAX($A$1:$A$4),$A$1:$B$4,2,0))

第一次误读了这个问题。

测试B1是否等于“”。如果它为空,则执行VLOOKUP搜索A列的最大值(最近的日期),然后使用相邻列的值(2)。

这不包括最近日期在B栏中没有值的情况。在这种情况下,我将返回“”。

趋势选项

根据您的评论和一些辅助细胞的使用,您可以执行以下操作。在您知道的日期和B中的已知值的右侧创建一个小表。我们可以使用以下公式填充此表。让这个表任意地放在F和G列中。

在F2中使用:

=IFERROR(INDEX($A$2:$A$1564,AGGREGATE(15,6,(ROW($B$2:$B$1564)-ROW($A$2)+1)/($B$2:$B$1564<>""),ROWS(B$2:B2))),"")

这将拉出日期,以便它们出现时B中的值不是“”。然后在G2中放入以下公式,其中将从B

中提取相关值
=IFERROR(INDEX($B$2:$B$1564,AGGREGATE(15,6,(ROW($B$2:$B$1564)-ROW($B$2)+1)/($B$2:$B$1564<>""),ROWS(B$2:B2))),"")

这两个公式当前都设置为使用标题行和从第2行开始的数据。

一旦我们设置了帮助表,您就可以设置一个TREND函数,这是一个最适合您所有已知点的线。您可以在此行中选择B中没有值的日期。在C2中,您将添加:

= IF(B2 = “”,TREND($ G $ 2:$ G $ 3,$ F $ 2:$ F $ 3 A2),B2)

你会复制这个公式。它检查B是否为空白。如果是,那么它从趋势线中拉出B的值。如果它不是空白,那么它将使用B中的值。

AVERAGE选项

再次在同一位置使用辅助表。这个有点丑陋。在C2中放置以下内容并复制

=IF(B2<>"",B2,IF($A2<$F$2,$G$2,IF($A2>$F$3,$G$3,(INDEX($G$2:$G$3,IFERROR(MATCH($A2,$F$2:$F$3,1),1))+INDEX($G$2:$G$3,IFERROR(MATCH($A2,$F$2:$F$3,1)+1,2)))/2)))

它首先要做的是检查B中的空白值。如果没有空白,则它使用B2中的值。如果B2中没有值,则继续检查助手表中第一个日期的空白日期。如果它小于第一个值,它使用B的第一个值,因为没有任何东西可以平均。然后我继续做同样的事情,看看日期是否超过了表格中的最后一个值。 (目前这是硬编码的)。如果它超过表中的最后一个日期,则它使用B的最后一个值。日期的最后一个选项是它在表中。它取日期和问题之前的日期与下一个日期之间的平均值。

可选版本,您无需对辅助表的最后一个值进行硬编码,但仍需要对辅助表的范围进行硬编码以满足您的需求。

=IF(B3<>"",B3,IF($A3<$F$2,$G$2,IF($A3>MAX($F$2:$F$3),VLOOKUP(MAX($F$2:$F$3),$F$2:$G$3,2,0),(INDEX($G$2:$G$3,IFERROR(MATCH($A3,$F$2:$F$3,1),1))+INDEX($G$2:$G$3,IFERROR(MATCH($A3,$F$2:$F$3,1)+1,2)))/2)))

趋势仅在两点之间

所以我在这个上调整了一下公式。它是上面列出的趋势和先前选项的混合。我还自动选择了表格的最终值,所以现在你只需要根据需要复制你的表格。它的工作前提是只存在B中的数据值,而不是最后一行的数字。

=IF($A2<$F$2,$G$2,IF($A2>=MAX(OFFSET($F$2,0,0,COUNT(B:B),1)),VLOOKUP(MAX(OFFSET($F$2,0,0,COUNT(B:B),1)),OFFSET($F$2,0,0,COUNT(B:B),2),2,0),TREND(OFFSET($F$2,IFERROR(MATCH($A2,OFFSET($F$2,0,0,COUNT(B:B),1),1),0)-1,1,2,1),OFFSET($F$2,IFERROR(MATCH($A2,OFFSET($F$2,0,0,COUNT(B:B),1),1)-1,0),0,2,1),$A2)))

所以基本上TREND功能是通过已知点最合适的线。如果你的知识点不是全部坐在一条直线上,它会计算出它们附近的直线,从而最大限度地缩短它们与直线的距离。如果我们限制它使用的点使其线只有2个点,那么该线必须通过这两个点。请记住,帮助程序表是所有已知点的列表。

基本上,公式所做的就是检查日期是否小于或等于辅助表上的第一个已知点。如果是,请使用表中第一个已知点的值。如果不是,请检查日期是否大于表中的最后一个日期,如果它是查找表中的最后一个已知日期并返回相应的表。如果这两种情况都不成立,则日期必须在表格中。这意味着我们可以从表中获得两个点以及它们在趋势函数中使用的相应值。我们为TREND函数提供一个包含2个已知X和2个Know Y值的数组,然后为它提供我们感兴趣的X值。在这种情况下,X将是日期,Y将是第二列中的值

修订的助手表

在F2中使用此公式:

=IFERROR(INDEX(OFFSET($A$2,0,0,COUNT(A:A),1),AGGREGATE(15,6,(ROW(OFFSET($A$2,0,1,COUNT(A:A),1))-ROW($A$2)+1)/(OFFSET($A$2,0,1,COUNT(A:A),1)<>""),ROWS(B$2:B2))),"")

和G2使用这个公式:

=IF(F2="","",INDEX(OFFSET($A$2,0,1,COUNT(A:A),1),MATCH(F2,OFFSET($A$2,0,0,COUNT(A:A),1),0)))

如果你想验证你想要复制助手表的距离,你可以把它放进去,比如I3:

=COUNT(B:B)+1

现在这些使用计数(A:A)或B:B的更新要求在A或B列中没有其他数字高于或低于您的数据。

更新平均值

我还调整了平均公式以提供此选项。

=IF($B2<>"",$B2,IF($A2<=$F$2,$G$2,IF($A2>=MAX(OFFSET($F$2,0,0,COUNT($B:$B),1)),VLOOKUP(MAX(OFFSET($F$2,0,0,COUNT($B:$B),1)),OFFSET($F$2,0,0,COUNT($B:$B),2),2,0),AVERAGE(OFFSET($F$2,IFERROR(MATCH($A2,OFFSET($F$2,0,0,COUNT($B:$B),1),1),0)-1,1,2,1)))))

示例结果(注意第14-69行已被隐藏,因此您可以看到第75行周围发生的事情。

Example results