在Matlab中将每小时数据转换为每日数据

时间:2019-03-14 06:27:44

标签: matlab matrix

我们有两个矩阵。将其中一个命名为“ Date”,并将另一个命名为“ Data” 日期矩阵中包含几列:

year month day julusi hour
1951    1   1   1   0
1951    1   1   1   3
1951    1   1   1   6
1951    1   1   1   9
1951    1   1   1   12
1951    1   1   1   15
1951    1   1   1   18
1951    1   1   1   21
1951    1   2   2   0
1951    1   2   2   3
1951    1   2   2   6
1951    1   2   2   9
1951    1   2   2   12
1951    1   2   2   15
1951    1   2   2   18
1951    1   2   2   21
....    .   .   .    .
....    .   .   .    .
1951    12  30  364 0
1951    12  30  364 3
1951    12  30  364 6
1951    12  30  364 9
1951    12  30  364 12
1951    12  30  364 15
1951    12  30  364 18
1951    12  30  364 21
1951    12  31  365 0
1951    12  31  365 3
1951    12  31  365 6
1951    12  31  365 9
1951    12  31  365 12
1951    12  31  365 15
1951    12  31  365 18
1951    12  31  365 21
....    ..   .   ..  .
2018    12  31  365 0
2018    12  31  365 3
2018    12  31  365 6
2018    12  31  365 9
2018    12  31  365 12
2018    12  31  365 15
2018    12  31  365 18
2018    12  31  365 21

在我的数据矩阵中,有410列(198696 * 410)。我的日期矩阵的大小相等。 “ 198696 * 1”。我想将基于“日期矩阵”的“数据矩阵”转换为每日数据 我使用以下代码

N=0;
for year=1951:2018;
for Juliusi=1:365;
cxa=(Date(:,4)==Juliusi);
cxb=(Date(:,1)==year);
a=cxa & cxb;
N=N+1;
dayy(N,:)=nanmean(Data(a,:));
end;end;

转换结果正确,但是矩阵大小不一样 198696/8 = 24837是正确的,但是我的矩阵24820不正确 问题出在哪里? 如何考虑leap日?

1 个答案:

答案 0 :(得分:1)

自从我最近从路易斯·门多(Luis Mendo)得知 convolution is the key to success 以来,我想到了以下想法:如果您的数据完整(即可以保证),则总是有8个条目对于每一天,您只需使用以下方法即可:

% Some test data.
Date = [
1951    1   1   1   0;
1951    1   1   1   3;
1951    1   1   1   6;
1951    1   1   1   9;
1951    1   1   1   12;
1951    1   1   1   15;
1951    1   1   1   18;
1951    1   1   1   21;
1952    1   2   2   0;
1952    1   2   2   3;
1952    1   2   2   6;
1952    1   2   2   9;
1952    1   2   2   12;
1952    1   2   2   15;
1952    1   2   2   18;
1952    1   2   2   21]

% Temporary result for convolution.
temp = conv2(Date, ones(8, 1)) / 8;

% Extract values of interest.
dayy = temp(8:8:end, :)

输出:

Date =
   1951      1      1      1      0
   1951      1      1      1      3
   1951      1      1      1      6
   1951      1      1      1      9
   1951      1      1      1     12
   1951      1      1      1     15
   1951      1      1      1     18
   1951      1      1      1     21
   1952      1      2      2      0
   1952      1      2      2      3
   1952      1      2      2      6
   1952      1      2      2      9
   1952      1      2      2     12
   1952      1      2      2     15
   1952      1      2      2     18
   1952      1      2      2     21

dayy =
   1951.0000      1.0000      1.0000      1.0000     10.5000
   1952.0000      1.0000      2.0000      2.0000     10.5000

如果您需要年份和日期信息,则可以分别获得这些信息。但是在您的原始帖子中,似乎不需要这些信息。


请确保:我确实知道,我在示例中使用了Date矩阵。但是,由于Date遵循与Data相同的格式,并且您可以轻松地验证所需的mean操作的结果,因此我以它为例。