Matlab中基于datenum的列值总和

时间:2018-12-27 23:33:22

标签: matlab date group-by

我想知道是否有一种有效的方法来根据{中的grouping/summing column(以年为单位)来计算matrix的{​​{1}} serial number date值{1}}。为了说明我的观点,假设数据如下:

column

` 人们期望得到:

Matlab version 2013

* PS:使用 737421 3 737106 -1 737222 4 736084 7 726105 -2 726442 4 函数可以在6 7 2 的最新版本中解决此问题

预先感谢

2 个答案:

答案 0 :(得分:1)

这是我的方法:

x = [737421  3
     737106 -1
     737222  4
     736084  7
     726105 -2
     726442  4]; % data
[~, ~, u] = unique(datestr(x(:,1), 'yyyy'), 'rows', 'stable'); % convert to years as
     % a 2D char array, and then get unique labels of each year (row) preseving order
y = accumarray(u, x(:,2)); % compute sums grouped by those labels

答案 1 :(得分:0)

您可以仅索引日期并对值进行求和,这很简单。问题将是要搜索的数组的大小。如果它很大,则可以从date的数据中取出一棵树作为节点,并且可以将idx作为该节点上的值放入数组中。然后在树中搜索开始日期和结束日期,这将给您在数组中求和的索引范围。生成树和搜索很容易,并且在线有示例。

x = [737421  3
     737106 -1
     737222  4
     736084  7
     726105 -2
     726442  4]; % data
idx = x(:,1) >= 737421 & x(:,1) <= 737222;
out = sum(x(idx,2));

编辑:

% Just updating to give one of the values to be correct. 
% There would have to be a for loop to check every 
% year range so @Luis Mendo is the best solution.
idx = x(:,1) >= 737106 & x(:,1) <= 737421; % index for each year
out = sum(x(idx,2));