Mit lubridate macht die Arbeit mit Datum und Zeit viel Spaß

Wer schon mal in R mit Datums- und Zeitangeben gearbeitet hat, der weiß, dass es wie es im Englischen so schön heißt „a pain in the ass“ ist. Datumsangeben kommen in unterschiedlichen Formaten daher, aus denen sich nur schwer einzelne Komponenten wie Tag, Monat oder Jahr exrahieren lassen. Dazu kommt der umständliche Umgang mit Zeitzonen, Sommerzeit und Schaltjahren. Mit dem Package lubridate (Link) ist das alles kein Problem.
Nachdem das Package installiert und mit library(lubridate) eingebunden ist, kann es auch schon losgehen. Um den Beispielcode nachvollziehen zu können, musst du zunächst mit Sys.setlocale("LC_TIME", "C") die locale entsprechend setzen.

Datumsangaben

Die Funktion today() liefert das aktuelle Datum zurück, und zwar als „Date“.

> heute <- today()
> heute
[1] "2016-10-19"

Es gibt drei Komponenten in diesem Datum; Jahr, Monat und Tag, in dieser Reihenfolge. Du kannst sie einzeln extrahieren mit den Funktionen year(), month() und day(). Ebenso lässt sich der Wochentag ermitteln mit wday(). Das Ergebnis ist eine Zahl zwischen 1 und 7, wobei 1 = Sonntag, 2 = Montag und so weiter. Analog lässt sich der Tag des Monats und des Jahres auslesen. Probiere es aus mit der eben erstellten Variable heute.

> heute <- today()
> j <- year(heute)
> m <- month(heute)
> t <-day(heute)
> rbind(j,m,t)
  [,1]
j 2016
m   10
t   19
> w <- wday(heute)
> m <- mday(heute)
> y <- yday(heute)
> rbind(w,m,y)
  [,1]
w    4
m   19
y  293

wday(heute, label = TRUE) liefert ein Kürzel des Wochentages als geordneter Faktor: [1] Wed
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat

Date-time

Neben dem Umgang mit Datumsangaben ist lubridate auch großartig, wenn es um Datum-Zeit-Kombinationen geht, auch date-time genannt. Die Funktion now() gibt ein date-time-Element com Typ POSIXct mit einer genauen Zeitangabe zurück. CEST bedeutet Central European Summer Time.

> moment <- now()
> moment
[1] "2016-10-19 16:50:22 CEST"
> h <- hour(moment)
> m <- minute(moment)
> s <- second(moment)
> rbind(h,m,s)
      [,1]
h 16.00000
m 50.00000
s 22.79124
Parsing

Datums- und Zeitangaben können sehr unterschiedliche Formate haben. Mal ist das Jahr vorangestellt, mal steht es hinten. Mal ist der Monat ausgeschrieben, mal durch eine Zahl dargestellt. lubridate hat die passenden Funktionen, um die verschiedensten Formate zu parsen. Sie haben die Form ymd(), dmy(), hms(), ymd_hms() und so weiter. Reine Datumsangaben liefern ein Objekt des Typs Date zurück, date-time-Angaben hingegen POSIXct mitsamt Zeitzone.

> datum <- ymd("2016-10-17")
> datum
[1] "2016-10-17"
> ymd("2016 May 31")
[1] "2016-05-31"
> mdy("January 12, 1971")
[1] "1971-01-12"
> dmy(29092009)
[1] "2009-09-29"
> ymd_hms("2016-10-23 19:23:59")
[1] "2016-10-23 19:23:59 UTC"
> hms("08:11:18")
[1] "8H 11M 18S"
Zeitzonen

Um etwa zu sehen, wie spät es gerade in Toronto ist, ruft man now() in Verbindung mit einer Zeitzone auf. Eine Liste aller Zeitzones findest du auf Wikipedia. Auch Arithmetik und die Berechnung von Zeitabständen sind möglich.

> jetzt <- now()
> jetzt
[1] "2016-10-19 21:53:37 CEST"
> toronto <- now("America/Toronto")
> toronto
[1] "2016-10-19 15:53:37 EDT"
> jetzt + days(2)
[1] "2016-10-21 21:53:37 CEST"
> jetzt + hours(100)
[1] "2016-10-24 01:53:37 CEST"
> later <- ymd("2018-05-23")
> dif <- interval(jetzt, later)
> as.period(dif)
[1] "1y 7m 3d 4H 6M 22.4860239028931S"