This is a guest post by Garrett Grolemund (mentored by Hadley Wickham)
Lubridate is an R package that makes it easier to work with dates and times. The newest release of lubridate (v 1.1.0) comes with even more tools and some significant changes over past versions. Below is a concise tour of some of the things lubridate can do for you. At the end of this post, I list some of the differences between lubridate (v 0.2.4) and lubridate (v 1.1.0). If you are an old hand at lubridate, please read this section to avoid surprises!
Lubridate was created by Garrett Grolemund and Hadley Wickham.
Parsing dates and times
Getting R to agree that your data contains the dates and times you think it does can be a bit tricky. Lubridate simplifies that. Identify the order in which the year, month, and day appears in your dates. Now arrange “y”, “m”, and “d” in the same order. This is the name of the function in lubridate that will parse your dates. For example,
library(lubridate) ymd("20110604"); mdy("06-04-2011"); dmy("04/06/2011") ## "2011-06-04 UTC" ## "2011-06-04 UTC" ## "2011-06-04 UTC"
Parsing functions automatically handle a wide variety of formats and separators, which simplifies the parsing process.
If your date includes time information, add h, m, and/or s to the name of the function. ymd_hms() is probably the most common date time format. To read the dates in with a certain time zone, supply the official name of that time zone in the tz argument.
arrive <- ymd_hms("2011-06-04 12:00:00", tz = "Pacific/Auckland") ## "2011-06-04 12:00:00 NZST" leave <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland") ## "2011-08-10 14:00:00 NZST"
Setting and Extracting information
Extract information from date times with the functions second(), minute(), hour(), day(), wday(), yday(), week(), month(), year(), and tz(). You can also use each of these to set (i.e, change) the given information. Notice that this will alter the date time. wday() and month() have an optional label argument, which replaces their numeric output with the name of the weekday or month.
second(arrive) ## 0 second(arrive) <- 25 arrive ## "2011-06-04 12:00:25 NZST" second(arrive) <- 0 wday(arrive) ## 7 wday(arrive, label = TRUE) ## Sat
There are two very useful things to do with dates and time zones. First, display the same moment in a different time zone. Second, create a new moment by combining a given clock time with a new time zone. These are accomplished by with_tz() and force_tz().
For example, I spent last summer researching in Auckland, New Zealand. I arranged to meet with my advisor, Hadley, over skype at 9:00 in the morning Auckland time. What time was that for Hadley who was back in Houston, TX?
meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland") ## "2011-07-01 09:00:00 NZST" with_tz(meeting, "America/Chicago") ## "2011-06-30 16:00:00 CDT"
So the meetings occurred at 4:00 Hadley’s time (and the day before no less). Of course, this was the same actual moment of time as 9:00 in New Zealand. It just appears to be a different day due to the curvature of the Earth.
What if Hadley made a mistake and signed on at 9:00 his time? What time would it then be my time?
mistake <- force_tz(meeting, "America/Chicago") ## "2011-07-01 09:00:00 CDT" with_tz(mistake, "Pacific/Auckland") ## "2011-07-02 02:00:00 NZST"
His call would arrive at 2:00 am my time! Luckily he never did that.