MATLAB索引按月安排每小时数据

时间:2016-08-10 20:31:10

标签: matlab indexing leap-year

我需要创建一个索引来帮助我安排25年的每小时数据(目前按照从1991年1月1日到2015年12月31日的每小时升序格式,包括跳跃的219144 * 54阵列)分组月 - 包括闰年。数据记录期为1991年至2015年,因此该期间有6个闰年 1月份的数据组将像31 * 24一样,将一年中的剩余时间跳到下一年的下一个起点,等等,重复25次。然后第二列将是2月占28或29 * 24的闰年,每次跳过重复25次。因此,最终的数组将有X行的12列 - 但也许有更好的解决方案..我不知道如何计算闰年的额外时间。谢谢!

2 个答案:

答案 0 :(得分: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)

要将它们放在一起,您可以使用逻辑索引运行类似下面的代码,以获取所有1月份的数据。

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

答案 1 :(得分: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,:)