【发布时间】:2013-12-24 06:58:37
【问题描述】:
我有每小时数据,我想找到每天最多 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,所以如果数据丢失一天,我不会知道。但我不知道在编写代码时如何考虑这一点。
【问题讨论】:
-
您能否仅发布相关数据的示例并相应地修剪您的代码?很难解读 23808 x 24 单元阵列实际代表的内容。
-
我放了整个代码,因为有些人喜欢运行它。我在相关部分周围加了星号。基本上,实际数据测量在第 17 列,它来自的站点的名称在第 6 列。重要的部分是 for 循环区域,尤其是从“执行循环以计算运行平均值”开始。希望对您有所帮助
-
你能把第 6 列和第 17 列的 10 行贴出来,然后删除星星之外的任何代码吗?其他一切都与您提出的问题无关。如果你想得到答案,你必须让人们容易理解和运行它。
-
O3_data最终成为N-by-M其中M=1因为O3是一个列向量,所以O3_MD8 = zeros(N,M-7);是一个空数组。循环中此代码附近的某处是否存在拼写错误或错误变量?此外,当将标量 (x = 1000;) 乘以数组时,您不需要bsxfun。 -
抱歉拖了这么久。必须转换为 csv 和其他东西。无论如何,希望现在更容易理解。
标签: matlab max filtering moving-average