Looping with datetime greater and less than 24 hour
조회 수: 2 (최근 30일)
이전 댓글 표시
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
채택된 답변
Steven Lord
2022년 6월 3일
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
추가 답변 (4개)
Walter Roberson
2022년 6월 3일
편집: Walter Roberson
2022년 6월 3일
h24 = hours(24);
a = mod(a, h24);
mod() works for duration!
댓글 수: 2
dpb
2022년 6월 3일
Clever; hadn't thought of it.
I was going to post the more-or-less brute force w/o explicit loop of
ix=abs(hours(a))>=24;
a(ix)-hours(24*sign(hours(a(ix))))
ans =
2×1 duration array
00:06:00
-00:05:00
Steven Lord
2022년 6월 3일
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
2022년 6월 3일
편집: eko supriyadi
2022년 6월 3일
댓글 수: 2
dpb
2022년 6월 3일
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
2022년 6월 3일
편집: dpb
2022년 6월 3일
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
Stephen23
2022년 6월 4일
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
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!