2016-08-10 4 views
1

Мне нужно создать индекс, который поможет мне организовать 25-летние почасовые данные (которые в настоящее время находятся в формате по возрастанию по часам с 1 января 1991 года по 31 декабря 2015 года в 219144 * 54, включая скачки) в группы по месяцам, включая високосные годы. Период записи данных - с 1991 по 2015 год, поэтому в этот период имеется 6 високосных годов.
Группа данных за январь будет чем-то вроде 31 * 24, пропуская оставшиеся часы года до следующего стартового места на следующий год и т. Д., Повторяя 25 раз. Затем второй столбец будет февраль, в котором будут високосные годы в 28 или 29 * 24 с пропуском каждого следующего года, повторяя 25 раз. Итак, последний массив будет иметь 12 столбцов по X строкам - но, возможно, есть лучшее решение. Я не уверен, как учитывать дополнительные часы в високосные годы. Спасибо!Индекс MATLAB для упорядочивания почасовых данных по месяцам

формат даты и времени
+0

Что вы пробовали до сих пор? Вы читали о [объекте даты и времени] (http://www.mathworks.com/help/matlab/date-and-time-operations.html)? Что означает 54? – EBH

+0

54 представляет 54 разных случая или наборы почасовых данных – user2100039

+0

Какова текущая форма ваших данных? – EBH

ответ

0

Предполагая, что ваши данные просто большой 219144-на-54 матрицы, вы можете использовать следующий код, чтобы организовать данные в большом массиве 5-D, индексированные по часовой день-месяц-год, и всякий раз, когда нет такой даты она имеет NaN:

dstart = datetime(1991,1,1,0,0,0); % starting time is 01-Jan-1991 00:00:00 
dend = datetime(2016,1,1,0,0,0); % End tine is 01-Jan-2016 00:00:00 
entries = hours(dend-dstart); % the total number of hours 
N = 54; % the number of samples in the data per hour 

% some arbitrary data - this should be your data 
data = repmat((1:entries).',1,N); 

Y = ceil(years(dend-dstart)); % the number of years in the data 
M = months(dstart,dend); % the number of months in the data 

% the output matrix that will contain all the rearranged data: 
arranged_data = nan(24,31,12,25,N); 

mstart = dstart; % starting month 
counter = 1; 
for mnth = 1:M % go over all months 
    mend = dateshift(mstart,'end','month'); % get the month period 
    dy = days(mend-mstart)+1; % find how many days are in this month 
    yr = year(mstart)-year(dstart)+1; % find the relevant year 
    [~,mo] = ymd(mstart); % get the number of the month (1-12) 

    % extract the relevat part of the data: 
    slice = reshape(data(counter:counter+dy*24-1,:),24,dy,N); 
    % and assign it to the correct place in the arranged array: 
    arranged_data(:,1:dy,mo,yr,:) = slice; 

    counter = counter+dy*24; % go to the next slice 
    mstart = mend+1; % update the starting date 
end 

Теперь, чтобы извлечь образец в какой-то момент вы пишете:

arranged_data(hour,day,month,year,sample) 

где hour является 1-24, day 1 -31, month является 1-12 и year является 1-25 sample является 1-54, и если вы хотите, чтобы все образцы за время записи:

arranged_data(hour,day,month,year,:) 
0

Используйте от Matlab предоставления ему год, месяц, день часы, минуты и секунды

somevariable=datetime(1991,1,1,00,00,00) 

Добавить индексы для любой функции вы смотрите, если ваши данные ежечасно вы можете, вероятно, просто сцепить дату переменная на ваш существующий набор данных.

alldates=datetime(1991,1,1,00,00,00):duration(1,0,0):datetime(2015,12,31,00,00,00) 

Запуск выше код будет генерировать вектор за каждый час в период с 1991 по 2015 год

Если вы еще не сохранили данные в таблице MatLab, рассмотреть вопрос об использовании, что так как это позволит вам сцепить разрозненные типы данных. Вы можете вызвать функцию типа array2table, которая преобразует ваши данные в таблицу.

После того, как вы это отформатирован должным образом, вы можете легко группировать данные с помощью элементов, как

month(somevariable) 
year(somevariable) 
day(somevariable) 

Чтобы поставить все это вместе, вы можете запустить что-то вроде кода ниже, используя логическую индексацию, чтобы получить все Январьские данные.

tablevariable=array2table(yourdata); 
tablevariable=horzcat(array2table(alldates','VariableNames','Dates'),tablevariable) 
tablevariable(month(tablevariable.Dates)==1,:) % this provides all data points for january