Loren on the Art of MATLAB

Turn ideas into MATLAB

Setting a New Time Basis for Date / Time Data

I was recently working with someone who had some temporal data in various formats and was trying to merge them in a meaningful way.

Contents

Problem Setup

I made a small subset of the data and loaded it in.

loadsetTimeBasiswhos
Name Size Bytes Class Attributes mydatestr 1x6 12 char t 5x1 161 datetime

First I looked at the both variables.

mydatestr
mydatestr = 090506
t
t = 12:32:28 12:59:50 12:59:51 12:59:52 12:59:53

You can see that I have a string representing a date (May 6, 2009), and then adatetimearray int. Though I saw thattwas adatetime, I kept thinking of it as a duration since I didn't see a month, year, etc. And I have to confess, though I usually do check the documentation, I was really resisting it yesterday - not sure why - perhaps I was being more obstinate than usual :-) !

What Didn't Work

Next I converted the base date todatetime, and tried adding it tot.

d = datetime('090506','InputFormat','MMddyy')tryd + tcatchE disp(E.message)end
d = 05-Sep-2006 Addition is not defined between datetime arrays.

First Working Shot

Ok, so that didn't work. I finally realized that even thoughtwas only displaying hours, minutes, and seconds, because it was adatetimearray and not aduration, I had to deal with that! I also realized that I used the wrong formatting for converting the original date formydatestrto adatetime! What was I thinking!

newdate = datetime(mydatestr,'InputFormat','yyMMdd')
newdate = 06-May-2009

Let's inspect the first time point now.

t1 = t(1); [year(t1) month(t1) day(t1)]
ans = 2016 6 7

Aha! Now I need to convert the date (not time) values intto that inolddate! I can do this by computing the difference in dates, leading to adurationarray which Icanadd to the base date.

olddate = datetime(year(t1),month(t1),day(t1)); datediff = newdate - olddate newt = t + datediff
datediff = -62136:00:00 newt = 12:32:28 12:59:50 12:59:51 12:59:52 12:59:53

Let's check out what's innewtnow (I know,eye(newt)!)

newt1 = newt(1); newt1.Format ='yy-MM-dd hh:mm:ss'
newt1 = 09-05-06 12:32:28

更好的回答

Frankly, I got it to work but it was really ugly and somewhat contorted. Had I responsibly read the documentation before, I just might have found a better way. Instead of showing you the doc right now, I will show you another way to poke for more information. Let's find out what I can do with adatetimearray.

methods(t)
Methods for class datetime: between hour le reshape caldiff interp1 length second cat intersect linspace setdiff cellstr isbetween lt setxor char iscolumn max size colon isdst mean sort ctranspose isempty median sortrows datenum isequal min std dateshift isequaln minus timeofday datestr isfinite minute transpose datetime isinf mode tzoffset datevec ismatrix month union day ismember ndims unique diff isnat ne vertcat eq isrow numel week exceltime isscalar permute year ge issorted plot ymd gt isvector plus yyyymmdd hms isweekend posixtime horzcat juliandate quarter Static methods: setDefaultFormats

Hmmmm!timeofdaysure sounds interesting, doesn't it!?! So let's try again.

newdate = datetime(mydatestr,'InputFormat','yyMMdd') tod = timeofday(t) newt2 = newdate + tod whos
newdate = 06-May-2009 tod = 12:32:28 12:59:50 12:59:51 12:59:52 12:59:53 newt2 = 06-May-2009 12:32:28 06-May-2009 12:59:50 06-May-2009 12:59:51 06-May-2009 12:59:52 06-May-2009 12:59:53 Name Size Bytes Class Attributes E 1x1 3106 MException ans 1x3 24 double d 1x1 121 datetime datediff 1x1 128 duration mydatestr 1x6 12 char newdate 1x1 121 datetime newt 5x1 201 datetime newt1 1x1 147 datetime newt2 5x1 185 datetime olddate 1x1 121 datetime t 5x1 161 datetime t1 1x1 129 datetime tod 5x1 160 duration

So now we have decent working code, much nicer than the first successful attempt too!

P.S.

This also could have been done with a for-loop instead of working on the arrays as arrays. For a larger set of data, my colleague found that a for-loop solution (including working with the old-styledatestretc. tools) took 29.0 seconds, and the first vectorized version took 2.3 seconds. I'm guessing the second attempt is faster but didn't bother timing it.

And You?

Have you been using the new date and time features, starting with Release R2014b? What have you had success or struggled with? Let us knowhere.

In case it helps you, we also have ashort videoaboutdatetimethat you might be interested in. Happy computing!




Published with MATLAB® R2016a

|

Comments

To leave a comment, please clickhereto sign in to your MathWorks Account or create a new one.