MATLAB Дата и время

У меня есть матрица столбца даты и времени в MATLAB, которую я хочу разбить на отдельные годы и назначить каждый год переменной. то есть если,

    Rows 1 to 5000 = 2015,

    Rows 5000 to 10000 = 2016,

    Rows 10001 to 16000 = 2017.

Может ли кто-нибудь помочь мне с кодом, чтобы сделать это, чтобы мне не приходилось делать это вручную.

Спасибо.


person MitchellSmith    schedule 22.10.2015    source источник
comment
1) вы не хотите назначать несколько переменных, потому что использование динамических переменных — это плохо. Кроме того, взгляните на datevec, первый столбец которого содержит год. Вы можете разделить на основе этого, используя unique.   -  person Adriaan    schedule 22.10.2015
comment
если вы делаете [y,m,d] = ymd(t), где t - ваш массив datetime, вы можете индексировать свои y , m и d соответственно (поскольку они являются целочисленными представлениями даты в формате Matrix). вы можете сделать year2015 = y(1:5000); или year2015 = find(y == 2015) и т.д.   -  person GameOfThrows    schedule 22.10.2015


Ответы (2)


Вы можете попробовать сделать следующее. Здесь вектор unique_years содержит годы в вашем векторе datetime, а newdatemat представляет собой массив ячеек с одной строкой для каждой группы дат, связанных с данным годом.

%// Sample data
datemat=[datetime(2015,5,3);...
         datetime(2015,3,5);...
         datetime(2016,4,2);...
         datetime(2014,1,1);...
         datetime(2014,3,2);...
         datetime(2017,3,3)];

%// Get the unique years from the date vector
unique_years = unique(year(datemat));

%// create a cell array newdatemat that contains
%// the datenums from datemat grouped by year
newdatemat=cell(length(unique_years), 1);
for ii=1:length(unique_years)
    newdatemat{ii} = datemat(year(datemat) == unique_years(ii));
end

Аналогичная версия приведенного выше кода приведена ниже по предложению @Adriaan:

mydatevec = datevec(datemat);
unique_years = unique(mydatevec(:,1));
newdatemat1=cell(length(unique_years), 1);
for ii=1:length(unique_years)
    newdatemat1{ii} = mydatevec(mydatevec(:,1) == unique_years(ii),:);
end
person houtanb    schedule 22.10.2015
comment
Умное решение! Престижность за то, что не используются динамические переменные в соответствии с запросом OP. Если вы воспользуетесь моим предложением, могу ли я предложить не использовать i в качестве переменная? - person Adriaan; 22.10.2015
comment
Спасибо за предложение @Adriaan. Я обновил пост соответственно - person houtanb; 22.10.2015

Вы можете использовать для этого accumarray, если сначала преобразуете его в datenum. Вы всегда можете конвертировать обратно после этого:

[~,~,subs] = unique(year(datemat));
A=accumarray(subs, datemat, [], @(x){x})

cellfun(@(x)datetime(datevec(x)),A,'uni',0)
person Dan    schedule 22.10.2015