2013-10-10 11 views
14

Ich habe ein df mit einer Spalte datetime (TT: MM: JJJJ HH: mm: ss) namens "Start" und ich möchte diese Spalte in zwei namens "date" und "time" aufgeteilt werden.
Nun habe ich folgendes versucht:Split Datum Zeit

df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1) 
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2) 

Dies funktioniert aber, wenn ich die Funktion str (df) verwenden (ich es kurz so kann man meist die Variablen meiner Sorge sehen).

'data.frame': 18363 obs. von 19 Variablen:
$ Start: Faktor w/67 Ebenen "2013-09-01 08: 07: 41.000", ..: 1 1 1 1 1 1 1 1 1 1 ...
$ Intervall: int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259 ...
$ DateTime: Faktor w/18363 Ebenen "2013-09-01 08: 07: 41.350", ..: 1 2 3 4 5 6 7 8 9 10 .. .
$ Timesensor: num 158489 158489 158490 158490 158491 ...


So, jetzt muss ich nur wissen, wie die Uhrzeit und das Datum von 'Faktoren' konvertieren, um 'Zeit' und 'Datum'.

Wenn jemand die Lösung kennt wäre ich sehr dankbar! Ich bin ein Noob bezüglich R so bitte brennt mich nicht auf den Boden ..

Danke eine Million!

+1

Verwenden 'sapply' statt' lapply' splitten. Wenn 'sapply' auf ein Ergebnis trifft, das" regulär "ist, wird ein Vektor oder eine Matrix zurückgegeben. 'lapply' ruft immer eine Liste zurück. –

+0

Das war es! Danke vielmals! – Jalalala

Antwort

9

Entschuldigung für diese späte Antwort! Wie auch immer, ich habe Hilfe von jemandem an der Universität, und er kam mit dem folgenden up, sehr einfach, Einstellung meines Zeit-Code ..:

df$Date <- as.Date(df$Start) #already got this one from the answers above 
df$Time <- format(as.POSIXct(df$Start) ,format = "%H:%M:%S") 

Dieser wandelt die Faktoren „Datum“ und „POSIXct“, wie ich es wollte.

Vielen Dank für Ihre Hilfe! Ich hoffe, ich kann in der Zukunft irgendeine Art von Gunst zurückgeben, obwohl ich bezweifle, ob es mit der Programmierung sein wird ..!

15

Wie wäre es

df$Date <- as.Date(df$Start) 

df$Time <- format(df$Start,"%H:%M:%S") 
+0

Das gibt mir diesen Fehler ..: Fehler in format.default (Struktur (as.character (x), Namen = Namen (x), dim = dim (x),: ungültig 'trimmen' Argument – Jalalala

+1

Sie haben df $ Start vom Typ "Zeichen", es ist kein Zeitstempel. Verwenden Sie die Funktion class(), um zu überprüfen. Sie sollten die Zeichenfolge in einen Zeitstempel konvertieren, bevor Sie die obigen Funktionen anwenden. –

+1

Danke, R habe es als Faktor gelesen.Ich habe bereits eine Kolumne mit den Daten, die tatsächlich "Date" als Klasse hat. Aber jetzt kämpfe ich mit der Zeit. Ich habe verwendet: df $ time <- as.POSIXlt (strptime (df $ Start, format = "[% Y-% m-% d% H:% M:% S]")) aber es wird nicht funktionieren .. Versuche immer noch! – Jalalala

2

Sie könnten es vorziehen, um so etwas zu tun, die Verwendung eines lapply Schleife zu vermeiden, die nicht wirklich notwendig ist (aber es ist nicht eine schlechte Sache auch nicht!) ...

# If we had this data... 
df <- data.frame(Start = c("13:11:2013 15:39" , "13:11:2013 16:15" , "13:11:2013 17:52")) 

# We can directly make two columns from the split strings without 
# using a loop by call 'do.call'.. 
new <- do.call(rbind , strsplit(as.character(df$Start) , " ")) 
#  [,1]   [,2] 
#[1,] "13:11:2013" "15:39" 
#[2,] "13:11:2013" "16:15" 
#[3,] "13:11:2013" "17:52" 


# Cbind them to the original data liek so... 
cbind(df , Date = new[,2] , Time = new[,1]) 
#    Start Date  Time 
#1 13:11:2013 15:39 15:39 13:11:2013 
#2 13:11:2013 16:15 16:15 13:11:2013 
#3 13:11:2013 17:52 17:52 13:11:2013 
+0

Dies scheint nicht zu funktionieren, aber das ist wahrscheinlich aufgrund der Tatsache, dass R lesen Sie es als ein Faktor. Danke! – Jalalala

+0

@JalouHuntjens 'as.character' sollte darauf achten. Die Daten in meinem Beispiel sind ebenfalls "Faktor". Kannst du 'str (df)' zum OP hinzufügen, damit ich sehen kann, wie es aussieht? –

+0

@JalouHuntjens Was war der Fehler, den Sie beim Ausführen meines Codes für Ihre Daten bekommen haben? Es sollte funktionieren. –

0

Wenn Sie Ihr Spaltenformat sehen, würde ich sagen, Sie könnten as.POSIXct verwenden, um Ihre Spalte richtig zu formatieren, und dann format() verwenden, um die gewünschten Daten zu extrahieren.

Dies ist der Code, den ich verwenden, wenn eine Datetime-Spalte,

df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S") 

df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")