Ich arbeite mich gerade ein wenig in R ein, da ich Daten aus CSV Dateien statistisch auswerten möchte. Dabei habe ich viel mit Datumsangaben zu tun. Im Folgenden ein paar Notizen die ich mir bisher gemacht habe
Datentyp in Spalte eines data.frame ändern
Beispiel: in einem data.frame existiert die Spalte Date. Beim Einlesen aus einer CSV Datei wird diese als kategorialer String erkannt.
Date,Status,Solution 2016-08-09T14:33:09,created,fixed 2015-08-09T14:33:09,blocked,won't fix
Einlesen: df <- read.csv("date.csv", header=T)
Mittels des Kommandos
df$Date <- as.Date(df$Date)
werden alle Werte umgewandelt.
Datetime umwandeln
Die R Klasse Date
repräsentiert nur ein Datum. Für Datetime sind die beiden Klassen POSIXct
und POSIXlt
vorhanden. Beide halten Daten unterschiedlich, liefern ansonsten allerdings ähnliche Funktionalität.
Umgewandelt wird wie folgt:
df$Date <- as.POSIXct(strptime(df$Date, "%Y-%m-%dT%H:%M:%S"))
Als Defaultformat wird das ISO 8601 lang Format (mit Bindestrichen und Doppelpunkten) verwendet. Allerdings mit dem Unterschied, dass nicht der Standarddelimiter T verwendet wird, sondern ein Leerzeichen. Beispiel: 2016-08-09 14:33:09. Aus diesem Grund kommt die Funktion strptime
zum Einsatz, der das entsprechende Muster ("%Y-%m-%dT%H:%M:%S") mit T als Delimiter übergeben wird. Wird dies nicht in dieser Art und Wiese gemacht, wird nur das Datum ermittelt und die Zeit auf 00:00:00 gesetzt.
Jahr aus Date
ermitteln
df <- within(df, YEAR <- as.numeric(format(df$Date, "%Y")))
Fügt gleichzeitig eine neue Spalte (YEAR) in den data.frame
ein. Dies liesse sich auch mittels df$YEAR <- as.numeric(format(df$Date, "%Y"))
erledigen. Der Vorteil von transform
ist, das mehrere Änderungen gleichzeitig durchgeführt werden können:
df <- within(df, {YEAR <- as.numeric(format(df$Date, "%Y")), MONTH <- as.numeric(format(df$Date, "%m")) })
Wochentag (numerisch) mit Basis 1 für Montag berechnen
df <- within(df, DOW <- ifelse((d = as.numeric(format(df$Date, "%w"))) == 0, 7, d))
Funktion holt aus einem Datum eines data.frame
s den Wochentag (as.numeric(format(df$Date, "%w"))
) und weisst ihn einer Hilfsvariablen zu. Diese wird verglichen mit 0, da POSIX Date eine 0 für Sonntag zurück gibt. Ist der Wert 0 wird eine 7 zurück geliefert, ansonsten der Wert der Hilfsvariablen.
Kalenderwoche ermitteln
- Mittels der Funktion
format(Sys.Date(), "%V")
kann die ISO 8601 Kalenderwoche ermittelt werden. - Mittels der Funktion
format(Sys.Date(), "%U")
kann die US Kalenderwoche ermittelt werden.
Ausgabe ist chr
. Mittels as.numeric(…)
in Zahl umwandeln.
Snippet um neue ISO WEEK Column in df ein zu fügen
df <- within(df, WEEK <- as.numeric(format(df$Date, "%V")))
Subset aus data.frame
Ein Subset aus Zeilen eines data.frame
, bei denen die Zellen einer Column einem Wert entsprechen. Zwei mögliche Lösungen:
rows1 <- df[df$Status == "created", ] rows2 <- subset(df, Status == "created")
Vorteil der subset
Funktion: Mittels des Parameters select
können Spalten definiert werden, die in rows2
übernommen werden sollen:
rows2 <- subset(df, Status == "created", select = c("Date", "Solution"))
Neben R verwende ich auch noch Bash Kommandos und sql4csv für die Bearbeitung von CSV Dateien. Für die Datenerhebung verwende ich unter anderen jan.