首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每日最高8小时平均运行/移动平均时间

每日最高8小时平均运行/移动平均时间
EN

Stack Overflow用户
提问于 2013-12-06 19:36:27
回答 1查看 2K关注 0票数 1

我有每小时的数据,我想找到每天最多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栏-数据

代码语言:javascript
复制
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

以下是我到目前为止所拥有的:

代码语言:javascript
复制
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,所以如果数据少了一天,我就不知道了。但我不知道在编写代码时该如何考虑这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-07 01:22:32

您可以只使用filter函数,尽管我假设您已经以正确的格式(一维向量)获得了数据。

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
%example
x = 1:240;   %d ata for 10 days
y = reshape(x,24,[])

然后使用max函数的附加参数按列搜索max:

代码语言:javascript
复制
% 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

分别:

代码语言:javascript
复制
dailyMax = max(reshape(movAV,24,[]),[],1)

对于您的情况,最方便的可能是使用findpeaks,它将直接输出所有本地极大值(所需的信号处理工具箱)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20432139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档