我有每小时的数据,我想找到每天最多8小时的平均值。基本上,对于一天中的每一个小时,我想做一个8小时的平均。所以,以平均0:00到8:00,然后1:00到9:00,等等),最后我得到了24小时的平均时间(当然,有些时间会持续到第二天)。然后,我需要最大的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,所以如果数据少了一天,我就不知道了。但我不知道在编写代码时该如何考虑这个问题。
发布于 2013-12-07 01:22:32
您可以只使用filter函数,尽管我假设您已经以正确的格式(一维向量)获得了数据。
hours = 8; % size of hour window defining the moving average
movAV = filter(ones(1,hours)/hours,1,O3_data);对于每天最多的时间,您需要将“小时”-vector和movAV分隔到24小时括号中。假设您每小时有一个值,您只需将结果重新组合成一个24 x N数组:
%example
x = 1:240; %d ata for 10 days
y = reshape(x,24,[])然后使用max函数的附加参数按列搜索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,它将直接输出所有本地极大值(所需的信号处理工具箱)。
https://stackoverflow.com/questions/20432139
复制相似问题