按月排列每小时数据的 MATLAB 索引

MATLAB Index to Arrange Hourly Data by Months

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

使用 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 table 中,请考虑使用它,因为它将允许您将不同的数据类型连接在一起。 您可以调用 array2table 之类的函数,它将您的数据转换为 table.

正确格式化后,您可以使用

之类的项目轻松对数据进行分组
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

假设您的数据只是一个 219144×54 的大矩阵,您可以使用以下代码将数据排列在一个大的 5 维数组中,按时-日-月-年索引,无论何时没有这样的日期它有一个 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,:)