Мне нужно создать индекс, который поможет мне организовать 25-летние почасовые данные (которые в настоящее время находятся в формате по возрастанию по часам с 1 января 1991 года по 31 декабря 2015 года в 219144 * 54, включая скачки) в группы по месяцам, включая високосные годы. Период записи данных - с 1991 по 2015 год, поэтому в этот период имеется 6 високосных годов.
Группа данных за январь будет чем-то вроде 31 * 24, пропуская оставшиеся часы года до следующего стартового места на следующий год и т. Д., Повторяя 25 раз. Затем второй столбец будет февраль, в котором будут високосные годы в 28 или 29 * 24 с пропуском каждого следующего года, повторяя 25 раз. Итак, последний массив будет иметь 12 столбцов по X строкам - но, возможно, есть лучшее решение. Я не уверен, как учитывать дополнительные часы в високосные годы. Спасибо!Индекс MATLAB для упорядочивания почасовых данных по месяцам
ответ
Предполагая, что ваши данные просто большой 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,:)
Используйте от 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
Что вы пробовали до сих пор? Вы читали о [объекте даты и времени] (http://www.mathworks.com/help/matlab/date-and-time-operations.html)? Что означает 54? – EBH
54 представляет 54 разных случая или наборы почасовых данных – user2100039
Какова текущая форма ваших данных? – EBH