Press "Enter" to skip to content

What is lubridate package in R?

Zigya Acadmey 0

Time series analysis in R requires a specific format of date objects. Lubridate is a package useful to create those objects. Lubridate is an R package that makes it easier to work with dates and times. Below is a concise tour of some of the things lubridate can do for you.

Installing and loading lubridate package

Type “install.packages(“janitor”)” and then press the Enter/Return key.

# to install lubridate
> install.packages("lubridate")

# to load it into your environment
> library(lubridate)

Parsing dates and times

Getting R to agree that your data contains the dates and times you think it does can be tricky. Lubridate simplifies that. Identify the order in which the year, month, and day appear 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")
[1] "2011-06-04"
> mdy("06-04-2011")
[1] "2011-06-04"
> dmy("04/06/2011")
[1] "2011-06-04"

Lubridate’s parse functions 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.

> date1 <- ymd_hms("2011-06-04 12:00:00", tz = "Pacific/Auckland")
> date1
[1] "2011-06-04 12:00:00 NZST"
> date2 <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")
> date2
[1] "2011-08-10 14:00:00 NZST"

Setting and Extracting information

Extract information from date times with the functions secondminutehourdaywdayydayweekmonthyear, 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(date1)
[1] 0
> second(date1) <- 25
> arrive
[1] "2011-06-04 12:00:25 NZST"
> second(date1) <- 0

> wday(date1)
[1] 7
> wday(date, label = TRUE)
[1] Sat
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat

Time Zones

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 an existing clock time with a new time zone. These are accomplished by with_tz and force_tz.

For example, a while ago I was in Auckland, New Zealand. I arranged to meet the co-author of lubridate, 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")
> with_tz(meeting, "America/Chicago")
[1] "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")
> with_tz(mistake, "Pacific/Auckland")
[1] "2011-07-02 02:00:00 NZST"

His call would arrive at 2:00 am my time! Luckily he never did that.

Time Intervals

You can save an interval of time as an Interval class object with lubridate. This is quite useful! For example, my stay in Auckland lasted from June 4, 2011 to August 10, 2011 (which we’ve already saved as arrive and leave). We can create this interval in one of two ways:

> auckland <- interval(arrive, leave)
> auckland
[1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
> auckland <- arrive %--% leave
> auckland
[1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST

My mentor at the University of Auckland, Chris, traveled to various conferences that year including the Joint Statistical Meetings (JSM). This took him out of the country from July 20 until the end of August.

> jsm <- interval(ymd(20110720, tz = "Pacific/Auckland"), ymd(20110831, tz = "Pacific/Auckland"))
> jsm
[1] 2011-07-20 NZST--2011-08-31 NZST

Will my visit overlap with and his travels? Yes.

> int_overlaps(jsm, auckland)
[1] TRUE

Then I better make hay while the sun shines! For what part of my visit will Chris be there?

> setdiff(auckland, jsm)
[1] 2011-06-04 12:00:00 NZST--2011-07-20 NZST

Other functions that work with intervals include int_startint_endint_flipint_shiftint_alignsunionintersectsetdiff, and %within%.

Arithmetic with date times

Intervals are specific time spans (because they are tied to specific dates), but lubridate also supplies two general time span classes: Durations and Periods. Helper functions for creating periods are named after the units of time (plural). Helper functions for creating durations follow the same format but begin with a “d” (for duration) or, if you prefer, and “e” (for exact).

> minutes(2) ## period
[1] "2M 0S"
> dminutes(2) ## duration
[1] "120s (~2 minutes)"

Why two classes? Because the timeline is not as reliable as the number line. The Duration class will always supply mathematically precise results. A duration year will always equal 365 days. Periods, on the other hand, fluctuate the same way the timeline does to give intuitive results. This makes them useful for modeling clock times. For example, durations will be honest in the face of a leap year, but periods may return what you want:

> leap_year(2011) ## regular year
> ymd(20110101) + dyears(1)
[1] "2012-01-01 06:00:00 UTC"
> ymd(20110101) + years(1)
[1] "2012-01-01"

> leap_year(2012) ## leap year
[1] TRUE
> ymd(20120101) + dyears(1)
[1] "2012-12-31 06:00:00 UTC"
> ymd(20120101) + years(1)
[1] "2013-01-01"

You can use periods and durations to do basic arithmetic with date times. For example, if I wanted to set up a reoccuring weekly skype meeting with Hadley, it would occur on:

> meetings <- meeting + weeks(0:5)

Hadley travelled to conferences at the same time as Chris. Which of these meetings would be affected? The last two.

> meetings %within% jsm

How long was my stay in Auckland?

> auckland / ddays(1)
[1] 67.08333
> auckland / ddays(2)
[1] 33.54167
>auckland / dminutes(1)
[1] 96600

And so on. Alternatively, we can do modulo and integer division. Sometimes this is more sensible than division – it is not obvious how to express a remainder as a fraction of a month because the length of a month constantly changes.

> auckland %/% months(1)
[1] 2
> auckland %% months(1)
[1] 2011-08-04 12:00:00 NZST--2011-08-10 14:00:00 NZST

Modulo with an timespan returns the remainder as a new (smaller) interval. You can turn this or any interval into a generalized time span with as.period.

> as.period(auckland %% months(1))
[1] "6d 2H 0M 0S"
> as.period(auckland)
[1] "2m 6d 2H 0M 0S"


Hence, we saw the package lubidate, how to install and load lubridate in R and also saw some of the common functions in lubridate that can make it easy to control date and time.

This brings the end of this Blog. We really appreciate your time.

Hope you liked it.

Do visit our page for more informative blogs on Data Science

Keep Reading! Cheers!

Zigya Academy

Leave a Reply

Your email address will not be published. Required fields are marked *