Преобразовать почасовые данные в ежедневные данные в Matlab - PullRequest
0 голосов
/ 14 марта 2019

У нас есть две матрицы.Назовите одно из них «Дата», а другое - «Данные». В матрицу «Дата» включены несколько столбцов:

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 неверна Где проблема? Что делать, чтобы считать високосные дни?

1 Ответ

1 голос
/ 14 марта 2019

Поскольку я недавно узнал от Луиса Мендо, что свертка является ключом к успеху , я пришел к следующей мысли: если ваши данные полны, то есть вы можете гарантировать, что на каждый день всегда есть 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, я использовал ее в качестве примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...