找到指数来计算时间序列中几个小时的月平均值

时间:2013-10-26 12:04:13

标签: matlab average

如果我有一年的数据

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2010-12-31 23:00','yyyy-mm-dd HH:MM');
dat = rand(length(Jday),1);

并想计算'dat'的月平均值,我会用:

% monthly averages
dateV = datevec(Jday);
[~,~,b] = unique(dateV(:,1:2),'rows');
monthly_av = accumarray(b,dat,[],@nanmean);

但是,我想计算当天发生的点数的月平均值,即6到18点之间,这怎么可以呢?

我可以在月平均值中隔离我希望使用的小时数:

idx = dateV(:,4) >= 6 & dateV(:,4) <= 18;

然后可以通过以下方式更改“b”以仅包含这些点:

b(double(idx) == 0) = 0;

然后按

计算平均值
monthly_av_new = accumarray(b,dat,[],@nanmean);

但这不起作用,因为accumarray只能使用正整数,因此我得到一个错误

使用accumarray时出错 第一个输入SUBS必须包含正整数下标。

做出我概述的最佳方式是什么?请记住,在执行此操作时我不想更改变量'dat',即在计算平均值之前从'dat'中删除一些值。

考虑一下,最好的解决方案是

monthly_av = accumarray(b(idx),dat(idx),[],@ nanmean);

1 个答案:

答案 0 :(得分:1)

你几乎拥有它。只需在idxb中使用dat进行逻辑索引:

monthly_av_new = accumarray(b(idx),dat(idx),[],@nanmean);

(不再需要行b(double(idx) == 0) = 0;。)

这样,b(idx)仅包含与您所需的小时间隔对应的索引,data(idx)包含相应的值。

编辑:现在我看到你已经找到了解决方案!是的,我认为这是最好的方法。