我在Excel中有10,000行数据,第一列是数据记录的时间(hh:mm:ss)。我只想过滤/提取(在前端)读数至少为连续六秒的行-这些是信号强度记录,我只认为至少连续六秒的读数对我的目的有效。我只想提取所附图像中绿色的行。单独提问-如果我想要仅为六到八秒的片段,该怎么办?谢谢!
dgtucam11#
对于O365(假设问题中使用的每个标签没有excel版本约束),您可以在单元格D1中尝试以下操作:
D1
=LET(rng, A1:B32, ref, SCAN("", INDEX(rng,,1), LAMBDA(ac,a, IF(ac="", 1, IF((a - TIME(0,0,1)) = OFFSET(a,-1,0), 0, 1)))), size, ROWS(ref), seq, SEQUENCE(size), start, FILTER(seq, ref=1), end, VSTACK(DROP(start-1, 1), size), DROP(REDUCE("", start, LAMBDA(ac,s, LET(e, XLOOKUP(s, start, end), f, FILTER(rng, (seq >= s) * (seq <= e)), IF(ROWS(f) > 5, VSTACK(ac, f), ac)))),1))
OFFSET
SCAN
ref
A
rng
0
1
1-N()
=LET(rng,A1:B32,A,INDEX(rng,,1), ref,VSTACK(1,1-N(DROP(A,1) =(DROP(A,-1)+TIME(0,0,1)))), size, ROWS(ref), seq, SEQUENCE(size), start, FILTER(seq, ref=1), end, VSTACK(DROP(start-1, 1), size), DROP(REDUCE("", start, LAMBDA(ac,s, LET(e, XLOOKUP(s, start, end), f, FILTER(rng, (seq >= s) * (seq <= e)), IF(ROWS(f) > 5, VSTACK(ac, f), ac)))),1))
下面是输出:
然后根据实际情况调整输入范围(rng)。
使用LET以便于阅读和合成。名称ref标识1,即从rng开始的第一列中具有连续秒数的每组值的开始。它与输入数据具有相同的行数。我们使用DROP/REDUCE/VSTACK模式迭代地生成输出,其中的数据满足以下条件:组具有5个以上连续元素。请检查以下问题的答案:如何将Excel中表格由纵变横但长度不同通过REDUCE,我们迭代所有起始组位置(start)。对于每个起始组位置(x一m一7一x),找到相应的端基位置(e)通过XLOOKUP。过滤范围(rng)用于行开始之间(seq)(s)和结束通过FILTER添加(e)行。仅当行数大于5时,才通过VSTACK函数追加筛选结果(f)。
LET
DROP/REDUCE/VSTACK
REDUCE
start
e
XLOOKUP
seq
s
FILTER
5
VSTACK
f
提供的公式太大,无法用于条件格式公式(255最大字符数)。可能的解决方法是使用帮助器列(您可以隐藏它)。如果行属于有效组,则返回TRUE,否则返回FALSE。如果未找到有效组,则也返回FALSE(我们使用以下技巧:NOT(SEQUENCE(size,,1,0)=1)以生成具有FALSE值的常量列)。然后,您可以突出显示与helper列中的TRUE值对应的列A值。
255
TRUE
FALSE
NOT(SEQUENCE(size,,1,0)=1)
=LET(A, TOCOL(A:A,1), ref, VSTACK(1,N(DROP(A,1) = (DROP(A,-1)+TIME(0,0,1)))), size, ROWS(ref), seq, SEQUENCE(size), start, FILTER(seq, ref=0), end, VSTACK(DROP(start-1, 1), size), gr, FILTER(HSTACK(start, end), (end-start +1) > 5, -1), sgr, INDEX(gr,,1), egr, INDEX(gr,,2), IF(@gr=-1, NOT(SEQUENCE(size,,1,0)=1), MAP(seq, LAMBDA(x, LET(overlaps, SUM((sgr <= x) * (egr >= x)), IF(overlaps = 1, TRUE, FALSE))))))
作为输入,我们使用整列,并通过TOCOL函数(名为A)使用该函数的第二个输入参数按非空值进行过滤。如果有多个重叠间隔,它也会返回FALSE。仅出于测试目的,它指示计算start和end名称时出现一些错误,因为根据设计,这种情况永远不应该发生。
TOCOL
end
=LET(rng,A1:B32,A,INDEX(rng,,1), ref, VSTACK(1,N(DROP(A,1) = (DROP(A,-1)+TIME(0,0,1)))), size, ROWS(ref), seq, SEQUENCE(size), start, FILTER(seq, ref=0), end, VSTACK(DROP(start-1, 1), size), gr, FILTER(HSTACK(start, end), (end-start +1) > 5, -1), sgr, INDEX(gr,,1), egr, INDEX(gr,,2), incl, IF(@gr=-1, NOT(SEQUENCE(size,,1,0)=1), MAP(seq, LAMBDA(x, LET(overlaps, SUM((sgr <= x) * (egr >= x)), IF(overlaps = 1, TRUE, FALSE))))), FILTER(rng, incl=TRUE, "No Group found"))
1条答案
按热度按时间dgtucam11#
对于O365(假设问题中使用的每个标签没有excel版本约束),您可以在单元格
D1
中尝试以下操作:OFFSET
,不使用SCAN
,而是使用如下比较来计算ref
值,可以实现相同的结果,其中A
表示rng
的第一列(我们保持与之前公式相同的逻辑,但可以简化,将逻辑更改为检查0
而不是1
,以删除1-N()
):下面是输出:
然后根据实际情况调整输入范围(
rng
)。解释
使用
LET
以便于阅读和合成。名称ref
标识1
,即从rng
开始的第一列中具有连续秒数的每组值的开始。它与输入数据具有相同的行数。我们使用
DROP/REDUCE/VSTACK
模式迭代地生成输出,其中的数据满足以下条件:组具有5个以上连续元素。请检查以下问题的答案:如何将Excel中表格由纵变横但长度不同通过
REDUCE
,我们迭代所有起始组位置(start
)。对于每个起始组位置(x一m一7一x),找到相应的端基位置(e
)通过XLOOKUP
。过滤范围(rng
)用于行开始之间(seq
)(s
)和结束通过FILTER
添加(e
)行。仅当行数大于5
时,才通过VSTACK
函数追加筛选结果(f
)。条件格式
提供的公式太大,无法用于条件格式公式(
255
最大字符数)。可能的解决方法是使用帮助器列(您可以隐藏它)。如果行属于有效组,则返回TRUE
,否则返回FALSE
。如果未找到有效组,则也返回FALSE
(我们使用以下技巧:NOT(SEQUENCE(size,,1,0)=1)
以生成具有FALSE
值的常量列)。然后,您可以突出显示与helper列中的TRUE
值对应的列A
值。作为输入,我们使用整列,并通过
TOCOL
函数(名为A
)使用该函数的第二个输入参数按非空值进行过滤。如果有多个重叠间隔,它也会返回FALSE
。仅出于测试目的,它指示计算start
和end
名称时出现一些错误,因为根据设计,这种情况永远不应该发生。FILTER
函数的条件,以便只选择值为TRUE
的输入范围。您想走哪条路线是一个品味问题。例如,如下所示: