Looping with datetime greater and less than 24 hour
11 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
eko supriyadi
am 3 Jun. 2022
Beantwortet: Stephen23
am 4 Jun. 2022
Hi community,
i'm stuck with looping and datetime
suppose, i have datetime array (actualiy i have large array):
a=[duration(0,22,0);duration(0,52,0);duration(24,06,0);duration(0,1,0);duration(-24,-5,0)];
so, it will produce
a =
5×1 duration array
00:22:00
00:52:00
24:06:00
00:01:00
-24:05:00
Now, i want to subtract those array that are greater than 24 hours by 24 hours and add times that are less than 24 hours by 24 hours..
the result what i want is like this:
a =
5×1 duration array
00:22:00
00:52:00
00:06:00
00:01:00
-00:05:00
this is the construct loop i have done but it still fails:
a=[duration(0,22,0);duration(0,52,0);duration(24,06,0);duration(0,1,0);duration(-24,-5,0)];
a1=[];
for i=1:length(a)
if a(i) >= hours(24);
a1 = a(i)-hours(24);
elseif a(i) < hours(-24);
a1 = a(i)+hours(-24);
else a1 == a;
end;end
appreciated much help!
0 Kommentare
Akzeptierte Antwort
Steven Lord
am 3 Jun. 2022
If the duration is less than -24 hours you want to add 24 hours to it not add -24 hours, right? Also FYI: you can pass vectors into the duration function to create a vector of durations.
a= duration([0; 0; 24; 0; -24], [22; 52; 6; 1; -5], [0; 0; 0; 0; 0])
a(a > hours( 24)) = a(a > hours( 24)) - hours(24)
a(a < hours(-24)) = a(a < hours(-24)) + hours(24)
0 Kommentare
Weitere Antworten (4)
Walter Roberson
am 3 Jun. 2022
Bearbeitet: Walter Roberson
am 3 Jun. 2022
h24 = hours(24);
a = mod(a, h24);
mod() works for duration!
2 Kommentare
Steven Lord
am 3 Jun. 2022
Instead of mod you want rem.
a= duration([0; 0; 24; 0; -24], [22; 52; 6; 1; -5], [0; 0; 0; 0; 0])
aMod = mod(a, hours(24))
aRem = rem(a, hours(24))
eko supriyadi
am 3 Jun. 2022
Bearbeitet: eko supriyadi
am 3 Jun. 2022
2 Kommentare
dpb
am 3 Jun. 2022
What about the looping step?
Other than
a1 = a(i)+hours(-24);
is turning -24 into -48 instead of 0 because of sign, it works.
One doesn't need the else if would just assign a1=a first, then operate on a1 inside the loop.
I didn't test Walters mod() but he rarely makes a goof -- far less frequent than I do, anyways -- I posted a way that works w/o the looping construct.
dpb
am 3 Jun. 2022
Bearbeitet: dpb
am 3 Jun. 2022
Since indeed mod() doesn't do what is wanted here for negative hours, I'll go ahead and post the alternative way that's akin to @Steven Lord's --
ix=abs(hours(a))>=24;
a(ix)-hours(24*sign(hours(a(ix))))
ans =
2×1 duration array
00:06:00
-00:05:00
that uses sign to perform the logical test and make correction in proper direction.
0 Kommentare
Stephen23
am 4 Jun. 2022
The simple and efficient approach is to use REM:
a = duration([0; 0; 24; 0; -24], [22; 52; 6; 1; -5], [0; 0; 0; 0; 0])
b = rem(a,hours(24))
0 Kommentare
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements 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!