【问题标题】:MATLAB: Calculate an average per every 5 minutes in serial-timeMATLAB:以串行时间每 5 分钟计算一次平均值
【发布时间】:2017-09-11 23:49:13
【问题描述】:

使用 MATLAB (R2015b) 我有一个时间序列 A,它是一个 4000x3 矩阵。下面是一个示例,其中第一列是串行时间(这里是从 13:56:37 到 14:25:09),第二列和第三列是测量值:

1.0e+05 *

7.366965809837962   0.000082000000000   0.062000000000000
7.366965810300925   0.000082500000000   0.013000000000000
7.366965836689815   0.000083000000000   0.040000000000000
7.366965857291667   0.000085000000000   0.013000000000000
7.366965875810186   0.000086000000000   0.010000000000000
7.366965876851851   0.000086000000000   0.020000000000000
7.366965889351852   0.000087000000000   0.015000000000000
7.366965892245370   0.000087000000000   0.016000000000000
7.366965896875000   0.000087000000000   0.004000000000000
7.366965897337963   0.000087500000000   0.050000000000000
7.366965901967592   0.000087500000000   0.002000000000000
7.366965906018518   0.000093000000000   0.010000000000000
7.366965907060185   0.000093000000000   0.010000000000000
7.366965928587963   0.000092000000000   0.010000000000000
7.366965962268518   0.000091500000000   0.030000000000000
7.366965973263889   0.000092000000000   0.001000000000000
7.366965974768519   0.000092000000000   0.050000000000000
7.366965982060186   0.000090000000000   0.010000000000000
7.366965993402777   0.000090000000000   0.090000000000000
7.366966007986111   0.000090000000000   0.043330000000000

如何计算每五分钟(而不是每个事件)第二列和第三列的平均值?所以在前 5 分钟 13:55:00 - 14:00:00 我们应该得到中间列的平均值 8.225 和右列的平均值 3750,即类似于:

13:55:00  8.225  3750
14:00:00  8.4    2650

我尝试过但没有成功,因此非常感谢任何帮助。

【问题讨论】:

    标签: matlab matrix time time-series


    【解决方案1】:

    我认为这对你有帮助

    %Inital reference position
    pos=1;
    
    %Counter
    count=1;
    
    for i=2:20
        %Elapsed seconds since the reference position
        elapsed_seconds=etime(datevec(a(i,1)),datevec(a(pos,1)));
        if elapsed_seconds>5*60 %Calculate means if larger than 5 minutes
            matrix(count,1)=a(pos,1);
            matrix(count,2)=mean(a(pos:(i-1),2));
            matrix(count,3)=mean(a(pos:(i-1),3));
            count=count+1; %Update counter
            pos=i; %Update reference position
        end
    end
    
    matrix
    

    【讨论】:

    • 我做了一些改变:)
    • 我不确定这是否完全有效。经过的时间是从a(i,1) 到a(pos,1) 计算的,但a(pos,1) 不一定从 5 分钟窗口的开头开始。
    • pos 从 1 开始,仅当 elapsed_seconds 大于 5*60(经过 5 分钟后)时才更新。我认为它可以正常工作:)
    • 考虑 a(1,:) 是否有元素 [1.3,2,3,5.5,7,8,10.1] 以分钟为单位。在前 5 分钟内,我们正确地取了 1.3、2 和 3 个元素的平均值。然后,该算法注意到 5.5 在第一个经过的 5 分钟之外,并将pos 更新为其索引(索引 4)。然后我们重新开始计算参考时间 5.5 分钟的经过时间。然后,我们在第二个 5 分钟窗口中获得元素 5.5、7、8、AND 10.1(包括 10.1,因为 10.1-5.5第三 5 分钟窗口中。
    【解决方案2】:

    这个问题的好处是你可以把它分成简单的块。首先,让我们将矩阵分解为向量

    times=A(1,:);
    measurementX=A(2,:);
    measurementY=A(3,:);
    

    第二部分是您需要将时间分成 5 分钟增量。让我们以 5 分钟为增量,从 7.366965809837962e5(您的第一次)到 7.366966007986111e5(您的最后一次)创建一个时间向量。不幸的是,我不知道在 MATLAB 中以 5 分钟的增量存在多少滴答声,我会任意假装它是 123e3。您需要正确替换该号码。

    timeIncrements=7.366965809837962e5:123e3:7.366966007986111e5
    

    现在我们需要找到一个增量开始之后和下一个增量开始之前的所有时间指标:

    for (i=1:length(timeIncrements)-1)
        indicies{i}=times>timeIncrements(i)&&times<=timeIncrements(i+1);
    end
    

    现在我们得到平均值

    for i=1:length(indicies)
        measurementX_5minIncrements(i)=mean(measurementX(indicies{i}));
        measurementY_5minIncrements(i)=mean(measurementY(indicies{i}));
    end
    

    重要提示!这是未经测试的,但提供了您需要做什么的一般要点。我无法访问 MATLAB,也无法确保它是正确的。 另外,这非常冗长,你的问题有两行答案,但没有实际使用 MATLAB,我想不出来(有一段时间我会我早就知道了,但可惜,那一天已经不复存在了)。祝你好运!

    【讨论】:

    • 感谢您的帮助!但是您能否澄清一下“timeBins”是什么(在第一个 for 循环中)?
    • 嘘。我的错。 timeBins ==> timeIncrements.
    猜你喜欢
    • 2019-02-21
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2023-01-31
    • 2012-09-02
    • 2020-04-25
    • 2021-12-15
    相关资源
    最近更新 更多