MATLAB中起始日期和结束日期之间的值之和

时间:2012-12-18 15:02:16

标签: algorithm matlab

如果在MATLAB中我有一组起始结束日期代表一个连续的时间段,我将如何采用单独的每日时间序列并累积所述时间序列中的任何值每个开始/结束对?

这可以通过accumarray()完成吗?我不清楚构建通过开始/结束对对时间序列的每个元素进行分组的向量是否有效。

Inputs

Start Date    End Date

01/01/12      01/31/12
02/01/12      02/28/12
...

Date          Value

01/01/12      23
01/02/12      87
01/03/12      5
01/04/12      12
...
02/01/12      4

Output

Start Date    End Date    Value

01/01/12      01/31/12    127
02/01/12      02/28/12    4
...

3 个答案:

答案 0 :(得分:3)

在连续的时间段内,以下方法可能有效。请注意,包含日期的字符串是单元格字符串,对于连续数据,只有开始日期/结束日期矩阵的第一列是必需的。

此外,请注意,为了清楚起见,我将时间序列数据分为两个变量。

dateBins = {...
    '01/01/12';
    '02/01/12';
    '03/01/12';
    '04/01/12'};

dates = {
    '01/01/12'
    '01/02/12'
    '01/03/12'
    '01/04/12'
    '02/01/12'    };

values = [
    23
    87
    5
    12
    4];

使用这些变量,以下代码

[thrash, idx] = histc(datenum(dates), datenum(dateBins))

accumVal = accumarray(idx, values);

result = zeros(length(dateBins), 1); 
result(1:length(accumVal),1) = accumVal;

将导致:

result =

   127
     4
     0
     0

答案 1 :(得分:1)

假设您已经有两个向量,其中包含可用于比较的格式的开始日期和结束日期,并且您只想计算每个类别中出现的次数,那么它非常简单:

% Your data
Dates = 25*rand(10,1);
StartDate = [1 10 20];
EndDate = [9 19 29];

% The Calculation
Result = zeros(size(StartDate)); %Initialization
for d = 1:length(startdate)
    idx = dates >= StartDate & dates <= EndDate;
    Result(d) = sum(idx);
end

请注意,这需要您以相似的格式存储日期。

答案 2 :(得分:1)

我会迭代每对开始/结束日期。然后挑出索引开始/停止对并求它们。如果你使用datestr s,你可以使下面的内容不那么脆弱,同时允许你更灵活地表示跨越年代的时间等等。

start_date = {'01/01/12'};
end_date={'01/31/12'};
datevec={'01/01/12','01/02/12','01/03/12','01/31/12'};
values=[23,87,5,12];

for i=1:numel(start_date)

    is = find(ismember(datevec,start_date{i})==1);
    ie = find(ismember(datevec,end_date{i})==1);

    sum(values(is:ie))

end