In diesem R-Artikel geht es darum, wie ihr in R mit Datums- und Zeitangaben umgeht. Dafür hat R drei Datentypen vorgesehen, nämlich Date für ein Datum und POSIXct bzw. POSIXlt für Zeitstempel, also Datum plus Zeitangabe. Reine Zeitangaben, also nur die Uhrzeit ohne Datum, sind eher selten und nicht sehr praktikabel.

Ich zeige euch, wie ihr Strings oder Zahlen in einen der Datentypen überführt und damit rechnen könnt. Für ein besseres Handling ist das Package “lubridate” aus dem tidyverse super geeignet. Dazu aber weiter unten mehr, wir fangen mit Standard-R an.

Der Datumstyp in R

Wir sehen also, dass sowohl Datum als auch Zeitstempel intern als Zahl gespeichert werden, nämlich als Anzahl Tage (Date) oder Sekunden (POSIX) seit einem festgelegten Startdatum, nämlich seit dem 1. Januar 1970 00:00 UTC. Als Zusatz wird aber doch noch abgespeichert, dass es sich um ein Datum oder Zeitstempel handelt. Das sehen wir an der Struktur (str). Sonst würde die print-Funktion ja auch nur eine Zahl ausgeben und nicht automatisch in einen String umwandeln.

Datum aus String

Wollen wir ein Datum aus einem String erzeugen, können wir entweder die Standardformate verwenden, die in R YYYY-MM-DD und YYYY/MM/DD sind. Ansonsten müssen wir mit dem Parameter format angeben, welches Format wir übergeben. Dabei gibt es einige Kürzel, die alle mit % anfangen. In der Liste unten findet ihr sie. Um aus einem Datum wieder einen String zu machen, könnt ihr die Funktion format benutzen.

Kürzel Beschreibung Beispiel
%m Monat (01-12) 05
%b or %h 3-stelliger Monatsname Feb
%B Monatsname Februar
%d Tag des Monats (01-31) 27
%j Tag vom Jahr (001-366) 148
%y 2-stelliges Jahr (00-99) 18
%Y 4-stelliges Jahr 2018
%C Jahrhundert 20
%x Datum (System)  
%D Datum MM/TT/JJJJ 05/27/84
%U Kalenderwoche, Sonntag=erster Tag der Woche (01-53) 22
%W Kalenderwoche, Montag=erster Tag der Woche (00-53) 22
%u Wochentag, Montag=1 (1-7) 7
%w Wochentag, Sonntag=0 (0-6) 0
%a 3-stelliger Wochentag So
%A Wochentag Donnerstag

Und so sieht das dann im Code aus:

Rechnen mit Daten

Datum mit dem Package lubridate

Viel einfacher geht das alles mit dem Package lubridate. Wie bei jedem Packages muss es einmal installiert werden install.packages(“lubridate”). Danach kann es mit library(lubridate) oder require(lubridate) im Skript geladen werden.

Lubridate hat einige Funktionen, um schnell ein Datum zu erzeugen, an die einzelnen Teile heranzukommen und auch diese abzuändern

Als nützlich haben sich auch die Rundungsfunktionen in lubridate erwiesen. Mit diesen kann zum Beispiel der Monatsanfang leicht bestimmt werden.

Zeitstempel

Ein Zeitstempel setzt sich aus Datum und Uhrzeit zusammen. Für eine richtige Uhrzeit ist noch die Zeitzone angegeben, damit es eindeutig wird. Der entsprechende Datentyp in R ist POSIXct bzw. POSIXlt. Diese beiden unterscheiden sich in der internen Darstellung. POSIXct speichert die Anzahl Sekunden seit dem Origin (UNIX Epoch, nämlich der 01.01.1970 00:00:00), POSIXlt speichert eine Liste mit Tag, Monat, Jahr, Stunde, Minute, etc.

Damit kann man mittels Attributen auf Teile eines POSIXlt zugreifen, beim POSIXct muss man über format den entsprechenden Wert extrahieren und dann gegebenenfalls noch in eine Zahl umwandeln. Mit dem Package lubridate läßt sich das vereinfachen, in dem per Funktion direkt auf die einzelnen Teile zugreifen kann, dazu weiter unten mehr.

Neben den Datumskürzelns aus der obigen Tabelle können wir mit den folgenden Kürzeln noch die Zeit definieren. Das funktioniert sowohl bei der Erzeugung aus einem String als auch der umgekehrte Weg mittels format.

Kürzel Beschreibung Beispiel
%c Zeitstempel im System-Format Fr Feb 22 10:55:19 2019
%H Stunden (00-24) 23
%I Stunden (00-12) 11
%M Minuten 55
%p AM/PM (sofern verwendet) AM
%S Decimal second 19
%X Zeit (Systemeinstellungen) HH:MM:SS
%z Abweichung von GMT +0100
%Z Zeitzone CET

Um die Zeitspanne zwischen zwei Zeitstempeln zu bestimmen, können wir sie einfach voneinander abziehen. Das Problem ist aber, dass wir dann die Einheit (Tage, Stunden, …) nicht selber wählen können. Daher ist es besser, dass über difftime zu machen und den Parameter units explizit zu setzen.

Zeitstempel mit lubridate

Zeittempel mit lubridate funktionieren ganz genauso wie wir das oben schon beim Datum gesehen haben. Es gibt Erzeuger-Funktionen wie ymd_hms und Funktionen, die die einzelnen Teile des Zeitstempels extrahieren. Ordnet man diesen Extraktionsfunktionen einen Wert zu, wird der Zeitstempel geändert.

So, ich hoffe, jetzt seid ihr zum Master of Date and Time geworden.