# Extract Data from Timetable

121 views (last 30 days)
Hi, i have a daytime Matrix and i also have a second timetable of 2 columns (first Time, second Data) of dates from which i want to extract for each daytime of the first Matrix the Data that refers to this Date fromthe second one!
Is there an easy way, without using a for loop, to do so?

Ioannis Tsikriteas on 2 Jun 2018
Paolo it seems the problem is at the conversion from datenum to datetime I changed my code so it does not need to use the addtodate function and to convert to datenum.
Here is my new code and it works
clear y
y=datetime;
up=air_temp.Time(height(air_temp));
down=air_temp.Time(1);
%x=datenum(x);
for i=1:length(x)
t=datetime(x(i)) - calyears([1]);
if (t>= down) && (t <= up)
y(i,5)=t;
else
y(i,5)=NaT;
end
t=datetime(x(i)) - calyears([2]);
if (t>= down) && (t <= up)
y(i,4)=t;
else
y(i,4)=NaT;
end
t=datetime(x(i)) - calyears([3]);
if (t>= down) && (t <= up)
y(i,3)=t;
else
y(i,3)=NaT;
end
t=datetime(x(i)) - calyears([4]);
if (t>= down) && (t <= up)
y(i,2)=t;
else
y(i,2)=NaT;
end
t=datetime(x(i)) - calyears([5]);
if (t>= down) && (t <= up)
y(i,1)=t;
else
y(i,1)=NaT;
end
t=datetime(x(i)) + calyears([1]);
if (t>= down) && (t <= up)
y(i,6)=t;
else
y(i,6)=NaT;
end
t=datetime(x(i)) + calyears([2]);
if (t>= down) && (t <= up)
y(i,7)=t;
else
y(i,7)=NaT;
end
t=datetime(x(i)) + calyears([3]);
if (t>= down) && (t <= up)
y(i,8)=t;
else
y(i,8)=NaT;
end
t=datetime(x(i)) + calyears([4]);
if (t>= down) && (t <= up)
y(i,9)=t;
else
y(i,9)=NaT;
end
t=datetime(x(i)) + calyears([5]);
if(t>= down) && (t <= up)
y(i,10)=t;
else
y(i,10)=NaT;
end
i=i+1;
end
end
Peter Perkins on 4 Jun 2018
Ioannis, I'm pretty sure every loop in your code is unnecessary. For example:
y = NaT(somePreallocationSize);
i = isbetween(x-calyears(1),down,up);
y(i,5) = t(i,5);
I can't really follow everything that's in your code, but that's the idea. This will run MUCH faster and is much simpler to write and maintain.
Ioannis Tsikriteas on 4 Jun 2018
Thank's a lot. You know...i am not as experienced in Matlab as you are. I wanted to add and to substract also to my dates 5 years. Indeed it was slow to execute all these loops but eventually it was a succesful attempt

Paolo on 2 Jun 2018
Edited: Paolo on 2 Jun 2018
A datetime matrix:
daytimemat = datetime(['13/04/2018';'25/04/2018';'28/04/2018'],'Format','dd/MM/yyyy');
A timetable with dates and data.
tt = timetable(datetime({'13/04/2018';'25/04/2018';'26/04/2018';'28/04/2018'}), [37.3;39.1;42.3;21]);
The following command:
%Use the index for which tt.Time and daytimemat are equal to find data.
tt.Var1(tt.Time(daytimemat))
outputs :
37.3000
39.1000
21.0000
which is the data contained in the timetable tt corresponding to the dates in daytimemat array.