为列值相等的每个组获取大小,并返回第3列值

时间:2016-02-05 03:00:47

标签: excel excel-formula

我有大量数据(约500,000行),含有水位信息。共有3列。

A: the water level (i.e. 0.7)
B: the date (i.e. 03/01/16)
C: the time (i.e 6:06:00)

我需要每天从A获得2个最大值和2个最小值,然后返回A&下进行。

所以基本上对于日期相等的所有行,找到最大和更小的行告诉我这些值并给我相关的时间。

这是一些数据:

2.730 | 03/04/16 | 3时54分零零秒
2.734 | 03/04/16 |三点36分00秒
2.735 | 03/04/16 |三时48分00秒
2.736 | 03/04/16 | 3时42分零零秒
0.046 | 03/05/16 | 10:30:00
0.047 | 03/05/16 | 10:36:00
0.048 | 03/05/16 | 10:24:00
0.050 | 03/05/16 | 10:42:00
0.052 | 03/05/16 | 10:18:00
0.056 | 03/05/16 | 10时48分00秒

每年大约有240行,为期5年。最后,我想要一张桌子,只有每天的高点和低点。

我尝试了各种解决方案,比如

  

= LARGE(A2:A241,1)

列A和

  

= VLOOKUP(F2,A2:C241,2,FALSE)

获取相关数据,但我不知道如何在没有手动选择每一天并执行1826次公式的情况下多天如何操作。请帮忙。感谢。

3 个答案:

答案 0 :(得分:2)

对于如此大的数据集,您希望避免使用数组公式,因此限制Small()或Large()的查找范围的方法更好。

考虑截图和公式的结果。我在E2中输入了第一个日期并使用填充手柄向下拖动并自动增加。我的日期以DMY顺序显示。

enter image description here

公式

F2 =LARGE(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),1)

G2 =LARGE(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2)

H2 =SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),1)

I2 =SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2)

....复制下来。此方法要求数据按B列中的日期升序排序。

要从C列返回匹配值,请将公式包装在C列的索引中,并在A列上匹配,例如,第二个最小的时间为

=INDEX($C:$C,MATCH(SMALL(INDEX($A:$A,MATCH($E2,$B:$B,0)):INDEX($A:$A,MATCH($E2,$B:$B,1)),2),$A:$A,0))

答案 1 :(得分:0)

试试这个:

![enter image description here

在E2中唯一的数组公式:

=IFERROR(INDEX($B$1:$B$10,MATCH(0,IF(COUNTIF($E$1:$E1,$B$1:$B$10)=0,0,1),0)),"")

必须使用Ctrl-Shift-Enter确认此公式。

在F2:

=IF(E2<>"",AGGREGATE(15,6,$A$1:$A$10/($B$1:$B$10=E2),1),"")

在G2:

=IF(E2<>"",INDEX($C$1:$C$10,MATCH(AGGREGATE(15,6,$A$1:$A$10/($B$1:$B$10=E2),1),$A$1:$A$10,0)),"")

在H2:

=IF(E2<>"",AGGREGATE(14,6,$A$1:$A$10/($B$1:$B$10=E2),1),"")

在I2:

=IF(E2<>"",INDEX($C$1:$C$10,MATCH(AGGREGATE(14,6,$A$1:$A$10/($B$1:$B$10=E2),1),$A$1:$A$10,0)),"")

然后复制下来。汇总功能于2010年推出。

然后根据需要将公式复制下来。在图片中,公式被复制到第15行。

此方法不关心列表是否已订购。

如果它是有序的,我相信@teylyn的回答是一个更快的计算。

答案 2 :(得分:0)

我将此添加为另一个答案,而不是尝试提供问题的解决方案,但是因为我想展示我在以前答案中提供的指数和聚合方法之间的计算速度比较的发现。

设定:

Excel“数据”表,包含500,000行数据,列“值”,“日期”,“时间” 每个日期都有多次表示。数据范围从2000年1月1日到2014年4月5日。每天有98个条目。

在另一张纸上,列E具有5209个日期,每行一个日期。在列F和G中使用两个不同的公式来查找“数据”表中每个日期的最大值。

H列比较两个公式的输出,单元格K1计算结果的差异。没有区别。两个公式都提供完全相同的结果。

该表包含5209行公式。这些公式中的每一个都评估500,000行数据。

“索引”列中的公式是

=LARGE(INDEX(data!$A:$A,MATCH($E3,data!$B:$B,0)):INDEX(data!$A:$A,MATCH($E3,data!$B:$B,1)),1)

注意:此方法取决于要按日期列升序排序的源数据。有可能数据是由某个监控系统生成的,这个监控系统会将一个读数放在另一个监控系统之后。除非有人工或程序干预,否则我将假设数据按日期排序。

“聚合”列中的公式为

=AGGREGATE(14,6,data!$A$2:$A$500000/(data!$B$2:$B$500000=E2),1)

目标是确定哪个公式更有效,即计算得更快。我正在使用Charles Williams编写的代码,他专门研究公式和VBA的性能。我使用了他的Range Timer,正如MSDN article中所发表的那样。

以下是我的设置的屏幕截图:

enter image description here

我选择了带有索引公式的列并运行了三次计时器。结果在19秒的范围内。

enter image description here

然后我选择了具有Aggregate公式的列并运行了计时器。第一次传球需要411秒,即6:52分钟。第二次传球需要425秒(7:05分钟)。

enter image description here

我没有对聚合公式结果进行第三次传递,因为我的笔记本电脑风扇正在进入超速状态并且变得非常歇斯底里且高音调。

为什么要发布此内容?

我想提请注意以下几点:

  • 问题中的数据样本通常只包含几行数据
  • 因此,此处建议的公式通常仅在小型数据样本上进行测试,但在真实环境中使用时可能效果不如预期。
  • 建议的指数公式看起来很复杂,而且非常满口。建议的Aggregate公式更短,看起来更整洁,但是,使用Index的公式比使用Aggregate的公式执行得更好。因此:较短的公式并不总能带来更快的计算

我可以访问我的示例文件here,如果你想让它旋转一下。请注意,它大约有20 MB,因为它有如此多的数据。要运行宏,请选择一个范围,然后单击蓝色按钮。