确定Excel中的特定时间段

ibps3vxo  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(376)

我在Excel中有10,000行数据,第一列是数据记录的时间(hh:mm:ss)。我只想过滤/提取(在前端)读数至少为连续六秒的行-这些是信号强度记录,我只认为至少连续六秒的读数对我的目的有效。我只想提取所附图像中绿色的行。单独提问-如果我想要仅为六到八秒的片段,该怎么办?谢谢!

dgtucam1

dgtucam11#

对于O365(假设问题中使用的每个标签没有excel版本约束),您可以在单元格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))
    • 注**:避免使用volatile functionOFFSET,不使用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)。

条件格式

提供的公式太大,无法用于条件格式公式(255最大字符数)。可能的解决方法是使用帮助器列(您可以隐藏它)。如果行属于有效组,则返回TRUE,否则返回FALSE。如果未找到有效组,则也返回FALSE(我们使用以下技巧:NOT(SEQUENCE(size,,1,0)=1)以生成具有FALSE值的常量列)。然后,您可以突出显示与helper列中的TRUE值对应的列A值。

=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。仅出于测试目的,它指示计算startend名称时出现一些错误,因为根据设计,这种情况永远不应该发生。

    • 提示**:前面的公式可以用于原来的目的,使用其输出作为FILTER函数的条件,以便只选择值为TRUE的输入范围。您想走哪条路线是一个品味问题。例如,如下所示:
=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"))

相关问题