Excel formula Excel:计算与时间戳接近度成对的连续值

Excel formula Excel:计算与时间戳接近度成对的连续值,excel-formula,excel-2013,Excel Formula,Excel 2013,我的问题 有一点背景知识,我可以访问一个数据库,该数据库为我提供带有时间戳的车辆的发动机状态代码。此发动机状态代码以十进制表示,但需要转换为二进制才能读取,因为每个发动机状态(无发动机转速、发动机减额等)都分配给16位中的一位。我已经了解了如何将这些十进制值转换为二进制,然后如何将二进制字符串拆分为单个单元格。我的数据现在看起来像这样: 这只是一个示例,值转到第8656行。因此,列E有时间戳,列F有引擎状态(十进制,即使它们在我提供的示例中看起来只有1或65个值,它们也会改变),列G是将列F转换

我的问题

有一点背景知识,我可以访问一个数据库,该数据库为我提供带有时间戳的车辆的发动机状态代码。此发动机状态代码以十进制表示,但需要转换为二进制才能读取,因为每个发动机状态(无发动机转速、发动机减额等)都分配给16位中的一位。我已经了解了如何将这些十进制值转换为二进制,然后如何将二进制字符串拆分为单个单元格。我的数据现在看起来像这样:

这只是一个示例,值转到第8656行。因此,列E有时间戳,列F有引擎状态(十进制,即使它们在我提供的示例中看起来只有1或65个值,它们也会改变),列G是将列F转换为16位二进制的,列H到W是列G中字符串的每一位。黑框包含我需要隐藏的值,它们被用作上述数据库查询的一部分

现在,我要做的是计算H列到W列中的每一列满足以下两个条件的次数:(1)该列中的值是1连续5次或更多,以及(2)这些连续事件的时间戳(在E列中)在两分钟之内。在这种情况下,满足这些条件的事件被视为其中一个发动机状态实际处于活动状态的事件,而不仅仅是一个短暂的光点。我需要知道每个位列的值。理想情况下,这些函数将位于位列上方的H3:W3中。对于参考点,数值的数量位于单元格E6中

我尝试的

我为条件(1)组合了以下函数,但它不起作用。我得到一个#值错误

=SUM(IF(FREQUENCY(IF(W7:W8656=1,COLUMN(W7:W8656)),IF(W7:W8656<>1,COLUMN(W7:W8656)))>=5,1))
下面是我用来拆分二进制字符串的方法:

首先:

=VALUE(MID(G7,1,1))
第二项:

=VALUE(MID(G7,2,1))

等等

好的。我想这可能对你有用。要确定5个连续的位,您可以将位列添加到自身5次(起点和终点各偏移一行:

=W7:W8654+W8:W8655+W9:W8656+W10:W8657+W11:W8658
这将根据5位数据中1的数量给出一个值为0-5的向量。然后要测试5个连续1的出现次数:

=SUM(IF(W7:W8654+W8:W8655+W9:W8656+W10:W8657+W11:W8658=5,1,0))
作为数组公式输入(CTRL-ENTER)

同样的逻辑也适用于寻找4个(不是5个——不要被一个错误愚弄!)连续的时间间隔(2分钟或更长)。此公式计算4个连续的时间间隔中有多少个2分钟的时间间隔:

=IF(E8:E8655-E7:E8654>=TIME(0,2,0),1,0)+IF(E9:E8656-E8:E8655>=TIME(0,2,0),1,0)+IF(E10:E8657-E9:E8656>=TIME(0,2,0),1,0)+IF(E11:E8658-E10:E8657>=TIME(0,2,0),1,0)
要检测4个连续的2分钟间隔,请再次使用=SUM(如果(…)公式:

当连续1位和连续2分钟的测试间隔同时发生时,这两个测试可以组合成一个大的计算公式

=SUM(IF(IF(E8:E8655-E7:E8654>=TIME(0,2,0),1,0)+IF(E9:E8656-E8:E8655>=TIME(0,2,0),1,0)+IF(E10:E8657-E9:E8656>=TIME(0,2,0),1,0)+IF(E11:E8658-E10:E8657>=TIME(0,2,0),1,0)=4,IF(W7:W8654+W8:W8655+W9:W8656+W10:W8657+W11:W8658=5,1,0),0))
顺便说一句,通过从连续1位的开始到结束测试8分钟并忽略内部测试间隔,可以大大简化测试的时间方面。这种更改可能会标记更多的测试失败,因此您需要评估额外的失败是否真实


这个解决方案有点混乱,所以我希望我已经解释得足够好了,希望它能有所帮助。

我会在前面说,我没有使用数组公式来解决这个问题,所以它几乎肯定可以简化

注意:为了避免出现#REF错误或公式随行号的不同而变化,我将行标题显示在第5行,第一行数据显示在第6行。我还根据时间戳(E列)对数据进行了排序。这很重要,或者下面的第2步不起作用

我的方法是使用一堆helper列。我已经将问题分为四个单独的数据测试,每个测试占用16列(每一位一列)。在所有情况下,每个公式都被复制到数据的底部,并跨到16列的每个块中

  • 测试一个条件是否连续五次为1
  • 列X到AM-公式(X6):
    =IF(总和(H2:H6)=5,1,0)
    (跨列X:AM复制,直到数据集底部)

  • 测试前5个结果是否都在2分钟内出现

  • 列AN到BC-公式(AN6):
    =IF(SUM($E6)-SUM($E2)nickelcap,我又试了一次。这假设(a)时间戳数据位于从$C$7开始的列中;(b)发动机状态代码位于从$D$7开始的列中,(C)数据可以向下延伸到第8656行

    A.定义可接受的最小时间间隔(2分钟)。在单元格X1中输入:

    =TIME(0,2,0)
    
    B.在列X中创建一列增量时间数据(无数据时将值设置为零)。在单元格X8中输入:

    =IF(LEN(TRIM($C8))=0,0,$C8-$C7)
    
    然后把这个公式填到第8656行

    C.创建一列二进制格式的发动机状态代码。这与您提出的公式相同,包装在过滤器中,如果没有数据,则将状态代码设置为全零。在单元格G7中输入:

    =IF(LEN(TRIM(D7))>0,DEC2BIN(INT(D7/256),8)&DEC2BIN(MOD(D7,256),8),"0000000000000‌​000")
    
    把这个公式填到第8658行

    D.范围H7:W8658具有与提取单个位相同的公式。例如,在H7:

    =VALUE(MID($G7,1,1))
    
    E.最后,计算重复故障代码的公式。要计算H列事件的故障,我在H4中有:

    =SUM(IF(IF($X$8:$X$8653<=$X$1,1,0)+IF($X$9:$X$8654<=$X$1,1,0)+IF($X$10:$X$8655<=$X$1,1,0)+IF($X$11:$X$8656<=$X$1,1,0)>=4,IF(H$7:H$8652+H$8:H$8653+H$9:H$8654+H$10:H$8655+H$11:H$8656>=5,1,0),0))
    

    =总和(如果($X$8:$X$8653您是否关心5个连续的1在位字符串中的何处出现?换句话说:您是否在计算字符串中任意位置的5个连续的1,而这与位置无关?或者您是否将5个连续的1以位0、位1、位11结尾作为单独的情况进行计算?我不确定是否理解您的意思。5个连续的1将是ppear在H到W范围内的单个列中。因此,位1由H7:H8656中的0和1表示,当存在1时,该位处于活动状态。该位对应于特定的引擎状态。因此,我要做的是,如果位1列中有五个连续的1,则进行计数,然后作为单独计数,在位2 colu中有五个连续的1mn,a
    
    =IF(LEN(TRIM(D7))>0,DEC2BIN(INT(D7/256),8)&DEC2BIN(MOD(D7,256),8),"0000000000000‌​000")
    
    =VALUE(MID($G7,1,1))
    
    =SUM(IF(IF($X$8:$X$8653<=$X$1,1,0)+IF($X$9:$X$8654<=$X$1,1,0)+IF($X$10:$X$8655<=$X$1,1,0)+IF($X$11:$X$8656<=$X$1,1,0)>=4,IF(H$7:H$8652+H$8:H$8653+H$9:H$8654+H$10:H$8655+H$11:H$8656>=5,1,0),0))