【问题标题】:find the indices to calculate the monthly averages of some hours in a time series找到指数来计算时间序列中某些小时的月平均值
【发布时间】:2013-10-26 12:04:12
【问题描述】:

如果我有一年的数据

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

【问题讨论】:

    标签: matlab average


    【解决方案1】:

    你几乎拥有它。只需在bdat 中使用带有idx 的逻辑索引:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多