scana
scana

Reputation: 111

Matlab, converting datetime array in matrix

I have a datetime array that highlights the peaks of a function "datepeak", for every day in one year. I obtained it using a datetime array "date" and the array with the position of the peaks "position".

t1 = datetime(year,1,1,0,0,0);
t2 = datetime(year,12,31,23,59,0);
date = t1:minutes(1):t2;
datepeak=date(position);

I need to take the n number of peaks for the day 1 and transpose this array to the first row of the matrix, and so on. Since the number of peaks are not constants (min 3 max 4) I tried to initiate the matrix like this:

matrix=NaN(365,4)

Then I override the NaN of every row with this double for loop:

for i=1:365
v=datepeak(day(datepeak,'dayofyear')==i);
for c=1:length(v)
    matrix(i,c)=(v(c));
end
end

This loop works (I tried it with the peaks), but with datetime I get an error.

Here's an example to paste:

year=2016;
position=[128 458 950];
t1 = datetime(year,1,1,0,0,0);
t2 = datetime(year,12,31,23,59,0);
date = t1:minutes(1):t2;
datepeak=date(position);

matrix=NaN(365,4);

for i=1:365
v=datepeak(day(datepeak,'dayofyear')==i);
for c=1:length(v)
    matrix(i,c)=(v(c));
end
end

Upvotes: 0

Views: 880

Answers (1)

G.J
G.J

Reputation: 795

The nan array is of class double whereas datepeak is of class datetime so you can't store them in the same array. The way you represent your data should be driven by what you want to do with them later (and what is feasible). In your case, i'll assume that list 365 elements, containing the (any number) peak times of the day is ok.

year=2016;
position=[128 458 950];
t1 = datetime(year,1,1,0,0,0);
t2 = datetime(year,12,31,23,59,0);
date = t1:minutes(1):t2;
datepeak=date(position);

peaktimes_list = cell(365,1);

for i=1:365
    peaktimes_list{i} = datepeak(day(datepeak,'dayofyear')==i);
end

EDIT : For a 365x4 cell array, change the last part by :

peaktimes = cell(365,4);

for i=1:365
    v = datepeak(day(datepeak,'dayofyear')==i);
    nv = numel(v);
    peaktimes(i,1:nv) = num2cell(v);
end

When there are less than 4 values, the remaining columns will be empty.

Upvotes: 1

Related Questions