Matlab does plot datetime data (only hours) on wrong day
22 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Renan Deuter
el 17 de Jul. de 2022
Comentada: Steven Lord
el 17 de Jul. de 2022
Hello,
I have data from two sensors that I want to plot in the same window to compare differences in my X value.
I have them both stored in tables and use the datetime "HH:mm:ss.SS" format.
For example:
sensor1.Time = ['12:41:50.00'; '12:41:51.00'; ...]
sensor1.x = [0.01; 0.02; 0.02; ...]
and
sensor2.Time = ['12:42:05.46'; '12:42:05.49'; ...]
sensor2.x = [0.01; 0.02; 0.01; ...]
When I plot the data using
plot(sensor1.Time, sensor1.x) it plots the data in a window and adds todays date.
However, when I plot the other table it adds a random date (here: 15.07.2022).
If I plot both using hold on; the data then looks like this which is not very helpful:
How can I fix this date error and have the data aligned on one day?
Best Regards,
Renan
0 comentarios
Respuesta aceptada
Star Strider
el 17 de Jul. de 2022
Without having the data to experiment with, my only suggestion is to plot them after converting them to duration arrays (that itself is not as straightforward as I would like it to be, especially since duration arrays are limited to one day in length) —
Time1 = datetime(2022,7,15) + minutes(0:1439).'
Data1 = sin(2*pi*(0:numel(Time1)-1)/720);
Time2 = datetime(2022,07,18) + minutes(0:1439).'
Data2 = cos(2*pi*(0:numel(Time1)-1)/720);
figure
plot(Time1, Data1)
figure
plot(Time2, Data2)
figure
plot(Time1,Data1)
hold on
plot(Time2, Data2)
hold off
Time1.Format = 'HH:mm:ss';
Dur1 = duration(string(Time1)); % Convert To 'duration' Array
Time2.Format = 'HH:mm:ss';
Dur2 = duration(string(Time2)); % Convert To 'duration' Array
figure
plot(Dur1, Data1)
hold on
plot(Dur2, Data2)
hold off
Your data will likely work for a duration array, however if they go for longer than one calendar day, it might be necessary to convert the time values only to datenum vectors and plot the data against that instead.
.
5 comentarios
Steven Lord
el 17 de Jul. de 2022
@Star Strider The behavior you described is correct, but it's not due to any issue with duration. It's due to the fact that the datetime data covers multiple days.
midnight = datetime('today')
dt = midnight + minutes([-5, 5])
dt.Format = 'HH:mm:ss'
If you extracted the duration data from the datetime array with timeofday, you could check for any large jumps. This would indicate crossing midnight and could be resolved by adding 24 hours.
tod = timeofday(dt)
d = [0, diff(tod)]
tod(d < 0) = tod(d < 0) + hours(24)
check = midnight - days(1) + tod
The check array looks like it matches the dt array.
Más respuestas (2)
the cyclist
el 17 de Jul. de 2022
The most fundamental fix to your issue is to explicitly use the modern datetime format for your times. Then, downstream functions that use them as inputs can be manipulated to control the display output.
Also, rather than "MATLAB randomly does something for some reason", one can generally find the exact behavior in the documentation for each function.
0 comentarios
Ver también
Categorías
Más información sobre Dates and Time en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!