Convert time vector of Year, Month, Day, Hours, Minute to Decimal format
22 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Marzuki Marzuki
am 17 Dez. 2021
Kommentiert: Siddharth Bhutiya
am 30 Dez. 2021
Hi everyone;
Suppose I have the following time vector:
....start from January
2019 10 02 12:00:00
2019 10 03 12:00:00
2019 10 04 12:00:00
2019 10 05 12:00:00
2019 10 06 12:00:00
2019 10 07 12:00:00
2019 10 08 12:00:00
2019 10 09 12:00:00
2019 10 10 12:00:00
2019 10 11 12:00:00
2019 10 12 12:00:00
2019 10 13 12:00:00
.....
I want to convert this time vector to decimal format, so it become:
2019,xxxx
2019,xxxx
2019,xxxx
etc
Any idea to do it, really appreciate it.
1 Kommentar
Siddharth Bhutiya
am 30 Dez. 2021
May I ask what you are planning to do with the (2019.xxxx) once you have calculated that? Because when you have a datetime object, it knows what operations can and cannot be done on a datetime. When you convert that into a double 2019.xxxx, that knowledge goes away. This could cause unexpected result if you are not careful later on in your code. For example, if you accidentally add 1 to it it changes the year from 2019 to 2020. You could multiply it with anything because its a double now, however, multiplication would not make sense for datetimes. So it would be helpful to know what you intend to do with those values.
Akzeptierte Antwort
Stephen23
am 18 Dez. 2021
Bearbeitet: Stephen23
am 18 Dez. 2021
Simpler:
format long G
D = datetime(2019,10,(2:13).',12,0,0)
B = dateshift(D, 'start', 'year'); % midnight at start of the year
E = B + calyears(1); % midnight at the end of the year (do not use DATESHIFT)
Y = year(D);
Y = Y + (D-B)./(E-B)
Lets check the first fraction by hand:
between(B(1),D(1),'Time') % hours from start of year to midday 2nd Oct.
between(B(1),E(1),'Time') % total hours in the year
6588/8760
2 Kommentare
Weitere Antworten (2)
Steven Lord
am 17 Dez. 2021
% Sample data
d = datetime(2019, 10, (2:6).', 12, 0, 0)
startOfYear = dateshift(d, 'start', 'year')
p = years(d-startOfYear)
% Use that year fraction data
corresponding = datetime(2021, 1, 1) + years(p)
2 Kommentare
Stephen23
am 18 Dez. 2021
Bearbeitet: Stephen23
am 18 Dez. 2021
format long G
365.2425 * 24 % hours
whereas in fact the length of a calendar year is a) never equal to this value and b) not constant. The bug in this approach can be clearly demonstrated at the end of a leap year, where this calculation returns midday on december the 31st as a fraction greater than one:
d = datetime(2020, 12, 31, 12, 0, 0) % leap year!
startOfYear = dateshift(d, 'start', 'year')
d-startOfYear % correct
p = years(d-startOfYear) % flawed
Adding this fraction to a year would give an ambiguous numeric value which can represent multiple dates, e.g. it would be impossible to tell the difference between 2020-12-31T12:00:00 and 2021-01-01T06:11:34.
Siehe auch
Kategorien
Mehr zu Dates and Time finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!