3

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
...
4

3 に答える 3

3

連続した期間では、次のアプローチが機能する場合があります。日付を含む文字列はセル文字列であり、連続したデータの場合、開始日/終了日のマトリックスの最初の列のみが必要であることに注意してください。

さらに、わかりやすくするために、時系列データを 2 つの変数に分けたことに注意してください。

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
于 2012-12-18T16:22:40.777 に答える
1

開始日と終了日の各ペアを繰り返し処理します。次に、インデックスの開始/停止のペアを選択し、それらを合計します。sを使用datestrすると、以下を脆弱性の少ないものにすることができますが、年をまたぐ時間の表現方法の柔軟性を高めることができます。

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
于 2012-12-18T15:57:08.367 に答える
1

比較に使用できる形式の開始日と終了日を含む 2 つのベクトルが既にあり、各カテゴリに発生した回数をカウントしたいだけであると仮定すると、それは非常に簡単です。

% 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

これには、日付を同等の形式で保存する必要があることに注意してください。

于 2012-12-18T15:51:57.270 に答える