条件平均值(AVERAGEIF,AVERAGEIFS或其他选项?)

时间:2015-09-11 15:31:10

标签: excel excel-formula

也许这只是一个漫长的一周,但我无法想到如何获得一个非常简单的平均值。

这是我的数据(两栏):

1/3/1994        1165
1/4/1994        1162
1/5/1994        1133
1/6/1994        1133
1/7/1994        1138
1/10/1994       1143
1/11/1994       1118
1/12/1994       1150
1/13/1994       1171
1/14/1994       1177
1/17/1994       1161
1/18/1994       1162
1/19/1994       1121
1/20/1994       1112
1/21/1994       1129
1/24/1994       1136
1/25/1994       1124
1/26/1994       1118
1/27/1994       1127
1/28/1994       1133
1/31/1994       1088
2/1/1994        1055
2/2/1994        1051
2/3/1994        1071
2/4/1994        1079
2/7/1994        1054
2/8/1994        1079
2/9/1994        1079
2/10/1994       1089
2/11/1994       1074
2/14/1994       1083
2/15/1994       1068
2/16/1994       1075
2/17/1994       1071

正如您所看到的,它是一列日期(一直持续到2015年9月9日,所以它很长),另一个价格。我只是试图获得每年1月份的平均值(即1994年1月,1995年,1996年,2015年,1994年2月等)。

这是我计划使用公式的表格:

             2007   2008    2009    2010    2011
January                 
February                    
March                   
April       

所以,在" 1月"以及" 2007",我想要2007年1月的平均价格。

我尝试使用它(再次,我的数据从A1和B1开始):

=AverageIfs(B:B,year(A:A),1994,month(A:A),1)(常规和数组),但它不起作用 - 我一直收到错误"您输入的公式包含错误。" (我真的更喜欢这是一个公式,而不是VB解决方案)

感谢您的任何想法!

编辑:与此同时,我创建了两个辅助列,它们只是每行数据的Month()Year()。然后我可以使用=AverageIfs(B:B,[month helper range],1,[year helper range],2007)。有没有办法在没有辅助列的情况下执行此操作?

5 个答案:

答案 0 :(得分:1)

我不知道这是否是最简洁的解决方案,但它确实有效。您可以按如下方式使用SUMPRODUCT

=SUMPRODUCT((MONTH($A:$A)=1)*(YEAR($A:$A)=1994)*$B:$B)/SUMPRODUCT((MONTH($A:$A)=1)*(YEAR($A:$A)=1994))

这实质上是根据两个标准对B列中的值进行求和,然后计算符合条件并除以该数字的行数。

对于每一行,MONTHYEAR条件评估为1(真)或0(假),然后将这两个值乘以列B中的值,得到列B的如果两个条件都为真,则为value;如果一个或两个条件为假,则为0。

答案 1 :(得分:1)

  • 假设您的数据有标题:单元格A1,B1中的“日期”和“价格”。
  • 假设您的数据以A2 = "1/3/1994"B2 = 1165
  • 开头

C1 = "Month" D1 = "Year" C2 = =TEXT(A2,"Mmmm") D2 = =YEAR(A2)

将单元格C2 + D2复制下来......

我把你的新表放在:

H2 = "January" H3 = "February"

......等等。

I1 = 1994 J1 = 1995

......等等。

I2 = =AVERAGEIFS($B:$B,$C:$C,$H2,$D:$D,I$1)

并在整个表格中复制该公式。

干杯!

答案 2 :(得分:1)

试试这个

=AVERAGE(IF(YEAR(A:A)=1994,IF(MONTH(A:A)=1,B:B,""),""))

作为数组公式输入(CTRL-SHIFT-ENTER)。如果您想将月份用作文本,可以使用

=AVERAGE(IF(YEAR(A:A)=1994,IF(TEXT(A:A,"mmmm")="January",B:B,""),""))

希望有所帮助

答案 3 :(得分:1)

是的,您可以使用AVERAGEIFS()。这比接受的答案快一千倍:

=AVERAGEIFS(B:B,A:A,">="&DATE(1994,1,1),A:A,"<"&DATE(1994,2,1))

你甚至可以通过这种方式来实现更简洁的公式,但我认为这会给非美国用户带来问题,因为他们的日期格式设置:

=AVERAGEIFS(B:B,A:A,">=1/1/94",A:A,"<2/1/94")

答案 4 :(得分:0)

此解决方案需要在&#34;表中使用结果&#34; 月份编号而不是月份名称

它还假设&#34;表与结果&#34;从F2开始(见图片)

然后使用这个公式:

=IFERROR(AVERAGEIFS($B:$B,$A:$A,">="&DATE(G$2,$F3,1),$A:$A,"<="&EOMONTH(DATE(Q$19,$P20,1),0)),"N/A")

enter image description here

如果期间没有价格(年/月),则公式显示“N/A”,如果您想看到空白,则将其替换为“”

对您的示例数据进行了少量更改以使用多个时段