我有每小时的数据,我想找到每日最多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,所以如果数据丢失一天,我不会知道。但我不知道在编写代码时如何考虑。
答案 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
直接输出所有局部最大值(需要信号处理工具箱)。