By Denver Kirrane and Tony Brady
Note. Since version 10, Stata has the ability to natively handle times. We therefore only recommend you use the commands below if you are using version 9 or below of Stata.
How do you handle time of day information such as 3:15am or 7:30pm in Stata? One solution, first suggested by Bill Gould is to convert times into fractions of a day like this:
Time | Fraction of day elapsed |
---|---|
3:00am | 0.125 |
6:00am | 0.25 |
12:00 (midday) | 0.5 |
8:30pm | 0.85417 |
00:00 (midnight) | 0.0 |
So that in the same way that dates are stored as whole days since 1 Jan 1960, times are stored as fractions of a day since midnight (midnight being the start of a new day). Storing times in this elapsed time format has the nice property that elapsed times can be added to elapsed dates to give a finer graded elapsed date format. Elapsed date-times can be compared to one another to see if one occurred before or after another using the usual < or > operators.
18th October 2003 is 15996
in Stata's elapsed date
format. So 15996.25
is 6:00am on 18th October 2003.
6:00pm on the same day would be 15996.75
and since
15996.75 > 15996.25
then Stata can tell that 6pm
on the 18th October 2003 is later than 6:00am on 18th October
2003.
Unfortunately Stata doesn't recognise this finer date format so
you can't use the format
command to show the time
of day stored in a value like 15996.25
.
However, we've provided you with a few tools to make converting times to elapsed times and back again easy. These are str2time and time2str.
str2time converts a string variable containing times in 24 hour clock format (HH:MM or HH:MM:SS) into an elapsed time format (a numeric value between 0 and 1).
Here's a dataset after running the command:
str2time tod, generate(etod)
tod (string) | etod (double) |
---|---|
03:17 | .13680556 |
15:26 | .64305556 |
13:23 | .55763889 |
14:30 | .60416667 |
16:25 | .68402778 |
02:36 | .10833333 |
14:50 | .61805556 |
01:27 | .06041667 |
13:19 | .55486111 |
20:54 | .87083333 |
time2str does the opposite to str2time. It converts a numeric variable containing elapsed times to a string variable containing times in 24 hour clock format (HH:MM or HH:MM:SS).
Here's a dataset after running the command:
time2str etod, generate(tod)
etod (double) | tod (string) |
---|---|
.25486111 | 06:06 |
.04444444 | 01:03 |
.42361111 | 10:09 |
.89791667 | 21:33 |
.52152778 | 12:31 |
.84097222 | 20:11 |
.21041667 | 05:02 |
.56388889 | 13:31 |
.26458333 | 06:20 |
.94722222 | 22:44 |
To convert a string of format HH:MM:SS to an elapsed time the formula is:
elapsed time = (HH + MM/60 + SS/3600)/24
To retrieve the hours, minutes and seconds from an elapsed
time, e
, we use:
HH = int(e*24) MM = int(60*(e*24 - HH)) SS = int(60*(60*(e*24 - HH) - MM))
Because computers use binary to store numbers they cannot always store fractions precisely. We have to do some rounding in Stata to prevent anomalies occurring when translating between the two formats.
To obtain str2time and time2str type the following into Stata:
net from https://www.sealedenvelope.com/
and follow the instructions on screen. This will ensure the files are installed in the right place and you can easily uninstall the command later if you wish.