data > opinion

Tom Alby

R-Funktion des Tages: as.Date()

2020-01-01


Sie sind hier: start / r funktion des tages as date /

Vor allem bei Zeitreihenanalysen werden Daten benötigt, in denen Datumswerte enthalten sind, zum Beispiel wenn es darum geht, den Einfluss eines Marketing-Kanals auf einen anderen zu messen. Nicht immer sind diese Datumswerte auch als Datentyp Datum gespeichert, so dass sie konvertiert werden müssen. Dabei hilft as.Date().

In diesem Beispiel geht es um zwei Spezialfälle, da es für as.Date() Unmengen an Anwendungsfällen gibt, aber schon an den einfachsten Sachen kann man scheitern. Die Daten stammen aus dem Google Keyword Planner, in der Spaltenüberschrift steht dann zum Beispiel “Searches: Dec 2018”. Wie kann daraus ein Datum gemacht werden? Zunächst einmal entfernen wir daraus “Searches:” beziehungsweise extrahieren das Monatskürzel und das Jahr daraus.

library(stringr)
myDate <- c("Searches: Dec 2018")
(myDate <- str_extract(myDate,"[A-Za-z]+ [0-9]+"))
## [1] "Dec 2018"

Nun soll aus diesem String ein Datumsobjekt konvertiert werden. as.Date() benötigt dazu etwas Hilfestellung, um zu wissen, was sich hinter den einzelnen Teilen des Strangs verbirgt.

as.Date(myDate,"%b %Y")
## [1] NA

Das hat schon mal nicht funktioniert. Der Grund hierfür ist ganz einfach: Für as.Date() existiert kein Datum, das nur aus einem Monat und einem Jahr besteht. Daher müssen wir einen Tag angeben:

as.Date(paste("01",myDate,sep=" "),"%d %b %Y")
## [1] NA

Aber auch das funktioniert noch nicht. Wir haben “Dec” als Dezember interpretiert, aber vielleicht kann unser System mit dem Dec nicht umgehen und hätte lieber “Dez”?

myDate2 <- c("Dez 2018")
as.Date(paste("01",myDate2,sep=" "),"%d %b %Y")
## [1] "2018-12-01"

Genau das war das Problem. Natürlich wollen wir jetzt nicht alle Monats-Strings ändern, die nicht zu unserem Locale passen. Darum überlisten wir das System für ein paar Zeilen. Zunächst speichern wir die Locale Time des Systems in der Variable lct, um dann das Locale auf C umzustellen. Mit diesem Locale funktioniert dann auch das Parsen des Datums-Strings und die Konvertierung. Zum Schluss stellen wir Locale der Zeit wieder um.

lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
## [1] "C"
as.Date(paste("01",myDate,sep=""),"%d %b %Y")
## [1] "2018-12-01"
Sys.setlocale("LC_TIME", lct)
## [1] "de_DE.UTF-8"
Tags: