Das lubridate Package
Heute schreibe ich über das lubridate Package, welches wir immer dann benutzen können, wenn wir mit Datumsvariablen in R umgehen müssen. Also, was macht lubridate so praktisch?
Das lubridate-Package
Erste Schritte mit lubridate und Daten vom Typ Date
Im Folgenden werden wir einige Szenarios durchspielen, in denen wir das lubridate-Package dafür gut verwenden können. Wie fast immer verwende ich dafür auch das data.table-Package (siehe hier für einen extra Post dazu).
Aber erstmal zu den Basics: Ein Datum ist vom Typ Date in R. Du solltest dich an das folgende internationale Format für ein Datum gewöhnen: „YYYY-mm-dd“, z.B. „2022-03-10“, also der 10. März 2022. Wenn du nun allerdings folgendes schreibst: mydate <- "2022-03-10"
, dann versteht R noch nicht, dass es ein Datum ist. Für R ist es nur eine Zeichenkette: str(mydate)
ergibt chr, also character. Um es zu deinem Datum zu machen, verwenden wir as.Date: mydate <- as.Date("2022-03-10")
. Nun ist es tatsächlich vom Date-Typ. Dies kann man auch leicht testen, indem wir z.B. folgendes schreiben: mydate+1
. Als Antwort sollte dort nun „2022-03-11“ stehen. Wir konnten also ohne Probleme einen Tag addieren.
Andere Formatierungen für Date
Der Vollständigkeit halber möchte ich erwähnen, dass man natürlich auch Zeichenketten mit anderem Format zu einem Date-Typ umwandeln kann. Dies kann häufig notwendig sein, wenn wir aus verschiedenen Quellen Datensätze haben. Im Folgenden siehst du einige Möglichkeiten:
#Different character to Date conversions
date1 <- as.Date("2022-03-10") #Typical format
date2 <- as.Date("10.03.2022", format="%d.%m.%Y") #German long format
date3 <- as.Date("10.03.22", format="%d.%m.%y") #German short format
date4 <- as.Date("03/10/2022", format="%m/%d/%Y") #US format
Wir sehen: die as.Date-Funktion beinhaltet noch einen Parameter, mit dem man das Format angeben kann. Die wichtigsten Zeichen sind hierbei: %d für den Tag, %m für den Monat, %Y für das Jahr (vierstellig) und %y für das Jahr (zweistellig).
Die Funktionen von lubridate
lubridate bietet viele Funktionen, die das Arbeiten mit Datumsangaben vereinfachen.
Der heutige Tag
Für einige Skripte immer wieder hilfreich: Die Funktion today()
, welche das heutige Datum zurückgibt. Angenommen wir haben ein data.table mit aktuellen Zeitreihendaten und wir möchten nur die letzten 30 Tage auswählen. Ganz einfach: recentdata <- fulltable[Date >= today()-30]
.
Datum aus Zeichenkette parsen mit lubridate
Um von einer Zeichenkette zu einem Date-Typ zu gelangen, haben wir oben as.Date benutzt. Allerdings geht es mit lubridate einfacher. Einige Beispiele (weiteres entimmst du der Dokumentation):
dmy("10.03.2022")
entsprichtas.Date("10.03.2022", format="%d.%m.%Y")
, aber auchas.Date("10.03.22", format="%d.%m.%y")
. Die Funktion denkt hier also mit und nimmt einem Arbeit ab.ymd("2022-03-10")
entsprichtas.Date("2022-03-10")
mdy("03/10/22")
entsprichtas.Date("03/10/22", format="%m/%d/%y")
- u.s.w.
Jahr, Monat oder Tag aus Datum extrahieren
Häufig möchten wir aus einem Datum z.B. nur das Jahr extrahieren. Haben wir also einen Vektor vom Typ Date, so können wir einfach das Jahr bestimmen: year(mydates)
. Im Folgenden eine Übersicht für alle wichtigen Funktionen in dem Zusammenhang:
- Jahr:
year(mydate)
- Monat:
month(mydate)
- Woche:
isoweek(mydate)
- Tag im Monat:
mday(mydate)
- Tag im Jahr:
yday(mydate)
- Wochentag:
wday(mydate)
Addieren oder Subtrahieren von Tagen, Wochen, Monaten oder Jahren
Mit lubridate können wir ganz einfach Zeiträume addieren oder subtrahieren. Beispiel: was für ein Tag ist heute in neun Monaten? today()+months(9)
liefert die Antwort. Dabei bleibt der Tag im Monat gleich und so muss man sich nicht damit herumschlagen, wie viele Tage addiert werden müssen, damit es passt. Möchten wir wissen, welcher Tag heute vor 20 Wochen war, gilt das selbe Prinzip: today()-weeks(20)
.
Weiteres mit dem lubridate-Package
Anbei noch weitere hilfreiche Tricks für das Handling von Datumszeiträumen.
Vektor von Min-Datum bis Max-Datum
Hin und wieder müssen wir einen Zeitraum abdecken und alle Tage von/bis in einem Vektor speichern. Dies geht einfach mit der seq-Funktion von R: myrange <- seq(today()-10, today()-1, by=1)
.
Beispiel mit einem Datensatz
Erstellen wir einen Datensatz:
dt <- data.table(Date=seq(today()-30, today()-1, by=1))
dt[, Weekday := wday(Date)]
Der Datensatz beinhaltet die letzten 30 Tage, sowie den Wochentag. Nun möchten wir eine Dummy-Variable erstellen, die nur für den Montag gilt: dt[, IsMonday := as.integer(wday(Date)==2)]
. Wir schauen, ob der Wochentag gleich 2 ist (1=Sonntag, 7=Samstag) und wandeln den logical-Wert (TRUE/FALSE) in einen int (Ganzzahl) um.
Soviel zum Thema Datumsvariablen und lubridate.
Wenn du noch Fragen hast, kommentiere gerne oder schreib‘ mir eine E-Mail!