0

私は年間データセットを持っています:

Jday = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2009-12-31 23:00','yyyy-mm-dd HH:MM');
DateV = datevec(Jday);
dat = 1+(10-1).*rand(length(Jday),10);
noise = 10*sin(2*pi*Jday/32)+20;
for i = 1:size(dat,2);
    dat2(:,i) = dat(:,i)+noise';
end

これは、水柱を通して記録された温度測定値を表します。各日の 06:00 から 18:00 までの温度範囲を計算して、深さごとに 365 の値が得られるようにして、最終的な行列を 365x10 にしたいと思います。

個々の日を次のように指定できます。

[~,~,b] = unique(DateV(:,2:3),'rows');

しかし、午前 6 時から午後 18 時の間に記録された値のみを考慮する方法がわかりません。これを行う最善の方法について誰かが情報を提供できますか?

修正:少し長い答え

Jday = datenum('2009-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2009-12-31 23:00','yyyy-mm-dd HH:MM');
DateV = datevec(Jday);
dat = 1+(10-1).*rand(length(Jday),10);
noise = 10*sin(2*pi*Jday/32)+20;
for i = 1:size(dat,2);
    dat2(:,i) = dat(:,i)+noise';
end

for i = 1:size(dat2,2);
    data = [DateV(:,4),dat2(:,i)]; % obtain all hours from DateV array

    dd = find(data(:,1) == 6); % find 06:00
    dd(:,2) = find(data(:,1) == 18); % find 18:00

    for ii = 1:size(dd,1);
        result(ii,i) = range(data(dd(ii,1):dd(ii,2),2)); % calculate range
    end
end
4

2 に答える 2

2

行列rangeが与えられた場合、各列を個別に操作します。これを使用して、各列に 06:00 から 18:00 までの時間間隔の値が含まれる行列を作成し、range.

  1. トリッキーな部分は、365x24 行 10 列の行列を操作して列を正しくすることです。

    A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
    

    これにより、3 次元の 24x10x365 行列が得られ、そこから行 7 ~ 18 を抽出できます。

  2. 次のステップはrange、結果を適用して 2 次元の 365x10 マトリックスに変換することです。

    result = permute(range(A(7:18, :, :)), [3, 2, 1]);
    

したがって、完全な解決策は次のとおりです。

A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
result = permute(range(A(7:18, :, :)), [3, 2, 1]);

EDIT
ソリューションをさらに一般的にするDateVために、目的の行のインデックスを取得するために使用できます:

idx = DateV(1:24, 4) >= 6 & DateV(1:24, 4) < 18;

そして、次のようにソリューションで使用します。

A = permute(reshape(dat2', [10, 24, 365]), [2, 1, 3]);
result = permute(range(A(idx, :, :)), [3, 2, 1]);
于 2013-02-26T18:11:21.983 に答える
2

1987 年 1 月 1 日から 1987 年 12 月 31 日までの時間単位の日付範囲:

start_date = datenum(1987,01,01,00,00,00)
end_date = datenum(1987,12,31,23,00,00)
interval = datenum(1987,0,0,1,0,0)-datenum(1987,0,0,0,0,0) % 1 hour interval

date_range = [start_date:interval:end_date]

非常にシンプルで、うるう年にも機能します。

于 2013-06-13T11:10:01.610 に答える