2013-10-26 92 views
0

如果我有一年的价值的数据找到指数来计算时间序列的几个小时,每月平均

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); 

,并想计算的“逸”的月平均值,我会用:

% 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

你几乎拥有它。就在bdat使用逻辑索引与idx

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

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

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

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

相关问题