# 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.

load setTimeBasis
whos

  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 a datetime array in t. Though I saw that t was a datetime, 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 to datetime, and tried adding it to t.

d = datetime('090506','InputFormat','MMddyy')
try
d + t
catch E
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 though t was only displaying hours, minutes, and seconds, because it was a datetime array and not a duration, I had to deal with that! I also realized that I used the wrong formatting for converting the original date for mydatestr to a datetime! 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 in t to that in olddate! I can do this by computing the difference in dates, leading to a duration array which I can add 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 in newt now (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 a datetime array.

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! timeofday sure 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-style datestr etc. 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 know here.

In case it helps you, we also have a short video about datetime that you might be interested in. Happy computing!

Published with MATLAB® R2016a

|