每日最多8小时运行平均值/移动平均值

时间:2013-12-06 19:36:27

标签: matlab max filtering moving-average

我有每小时的数据,我想找到每日最多8小时的平均值。基本上,对于一天中的每个小时,我想要平均8小时。所以平均为0:00到8:00,然后是1:00到9:00等等,所以我最终得到24个8小时的平均周期(有些人当然会跑到第二天)。然后我需要将这24个8小时平均值中的最大值用于获得每日最大值。

可以在此处找到使用的.mat文件:https://www.dropbox.com/sh/9e2dgm0imvr0hpe/tAUOtpZEEa

关于文件格式的说明:O3.mat文件有一个名为O3_Sorted的变量,它是一个单元格数组。它包含已经排序的所有数据。但是数据包含来自多个站点的信息(即,来自不同地方的信息)。每个站点的信息一起排序,但在代码中,当我尝试查找8小时平均值时,我必须一次拉出一个站点,以便平均值不会遇到数据的开头另一个地方。

以下是一些事物的样本。我包括一天的一个网站和半天的另一个网站。实际文件也包含每个站点和其他站点的一个月的数据。如您所见,有时,数据丢失了。 第1栏 - 网站名称 第2栏 - 日期 第3栏 - 小时 第4栏 - 数据

003-0010    2007-05-31  00:00   0.016
003-0010    2007-05-31  01:00   0.015
003-0010    2007-05-31  02:00   0.002
003-0010    2007-05-31  03:00   0.03
003-0010    2007-05-31  04:00   0.019
003-0010    2007-05-31  05:00   0.013
003-0010    2007-05-31  06:00   0.018
003-0010    2007-05-31  07:00   0.024
003-0010    2007-05-31  08:00   0.031
003-0010    2007-05-31  09:00   0.029
003-0010    2007-05-31  10:00   0.031
003-0010    2007-05-31  11:00   0.035
003-0010    2007-05-31  12:00   0.026
003-0010    2007-05-31  13:00   0.026
003-0010    2007-05-31  14:00   0.033
003-0010    2007-05-31  15:00   0.039
003-0010    2007-05-31  16:00   0.036
003-0010    2007-05-31  17:00   0.035
003-0010    2007-05-31  18:00   0.031
003-0010    2007-05-31  19:00   0.03
003-0010    2007-05-31  20:00   0.03
003-0010    2007-05-31  21:00   0.017
003-0010    2007-05-31  22:00   0.017
003-0010    2007-05-31  23:00   0.007
027-0007    2007-05-31  00:00   0.045
027-0007    2007-05-31  01:00   0.043
027-0007    2007-05-31  02:00   
027-0007    2007-05-31  03:00   0.038
027-0007    2007-05-31  04:00   0.037
027-0007    2007-05-31  05:00   0.034
027-0007    2007-05-31  06:00   0.034
027-0007    2007-05-31  07:00   0.038
027-0007    2007-05-31  08:00   0.044
027-0007    2007-05-31  09:00   0.05
027-0007    2007-05-31  10:00   0.054
027-0007    2007-05-31  11:00   0.051
027-0007    2007-05-31  12:00   0.047

这是我到目前为止所做的:

for i = 1:size(O3_sites)
    I = ismember(D(:,6), O3_sites(i)); % Rows were the cell array O3_sorted has data corresponding to a certain site
    site = D(I,:);

    %% Convert O3 from ppm to ppb, 1ppm = 1000ppb
    x = 1000;
    y = str2double(O3);
    O3_data = bsxfun(@times,x,y); % ppb    

% Find size of array
[M, N]= size(O3_data); 

% Create empty array
O3_MD8 = zeros(N,M-7); % double

**% Do a loop to calculate the running mean
for j = 1:M-7
    A = O3_data(j:j+7);
    O3_MD8(:,j) = mean(A);
end**

% Find max from each 8-hour loop

end

获得8小时平均值后,我如何要求MATLAB找到每24个平均值的最大值?基本上,获得每小时平均值的最大值。

另外,我现在尝试做的方法有点冒险,因为我没有使用datenum,所以如果数据丢失一天,我不会知道。但我不知道在编写代码时如何考虑。

1 个答案:

答案 0 :(得分:2)

您可以使用filter函数,但我假设您已经以适当的格式获取数据(1D-vector)

hours = 8;   % size of hour window defining the moving average
movAV = filter(ones(1,hours)/hours,1,O3_data);

对于每日最高数量,您需要在24小时括号中拆分“小时” - 矢量和movAV。假设您每小时有一个值,您可以将结果重新整形为24 x N数组:

%example
x = 1:240;   %d ata for 10 days
y = reshape(x,24,[])

然后使用max函数的其他参数来逐列搜索最大值:

% in this case the max is always the last value of every day
dailyMax = max(y,[],1) 

dailyMax =

    24    48    72    96   120   144   168   192   216   240

分别为:

dailyMax = max(reshape(movAV,24,[]),[],1)

对于您的情况,最方便的是使用findpeaks直接输出所有局部最大值(需要信号处理工具箱)。