2013-04-30 8 views
12

ich eine Datendatei haben, die damit drei Spalten:R - Umwandlung Datums- und Zeitfelder mit SSMMSS Format POSIXct

20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772 
... 

Wie das menschliche Auge ziemlich klar ist, die ersten beiden sind Datum und Uhrzeit. Ich muss sie in ein POSIXct konvertieren (oder etwas anderes, wenn es besser ist, aber meine begrenzte Vergangenheit Erfahrung im Umgang mit Zeitstempeln in R ist die Verwendung von POSIXct). Normalerweise ist es in mit read.table geschlürft, würde ich verwenden:

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

Allerdings scheint die zweite Säule seine führenden Nullen zu verlieren, und somit ist es nicht richtig funktioniert (wahrscheinlich durch eine Art Zwang?) .

Ich habe mir Combine date as integer and time as factor to POSIXct in R und Converting two columns of date and time data to one angesehen, aber beide verwenden Zeiten mit Trennzeichen wie:, und haben daher nicht das gleiche Problem.

Wie kann ich diese Spalten bitte in einen POSIXct umwandeln?

Antwort

16

Sie waren sehr nah dran. Das folgende "einfach" erzwingt das Lesen der ersten beiden Spalten als Zeichenketten, wodurch die führenden Nullen gespeichert werden.

R> df <- read.table(text="20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772", 
+ header=FALSE, colClasses=c("character", "character", "numeric"), 
+ col.names=c("Date", "Time", "Val")) 
R> df 
     Date Time Val 
1 20010101 000000 0.833 
2 20010101 000500 0.814 
3 20010101 001000 0.794 
4 20010101 001500 0.772 

Nun, was Sie versuchten, "einfach funktioniert":

R> df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S") 
R> df 
     Date Time Val   DateTime 
1 20010101 000000 0.833 2001-01-01 00:00:00 
2 20010101 000500 0.814 2001-01-01 00:05:00 
3 20010101 001000 0.794 2001-01-01 00:10:00 
4 20010101 001500 0.772 2001-01-01 00:15:00 
R> 
3

Sie müssen nur die Daten als Zeichen importieren:

txt <- "Date Time value 
20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772 
" 

df <- read.table(text=txt, header=TRUE, 
       colClasses=c("character", "character", "numeric")) 

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S") 
+0

Danke. Ich akzeptiere die Antwort, die zuerst kam, aber das ist im Wesentlichen das Gleiche :-) – Flyto

1

einfach können Sie lubridate Paket verwenden, das ist super fantastisch und schnell. Für Ihren Zweck versuchen Sie dies:

df <- read.table(text="20010101 000000 0.833 
20010101 000500 0.814 
20010101 001000 0.794 
20010101 001500 0.772", 
        header=FALSE, colClasses=c("character", "character",  "numeric"), 
        col.names=c("Date", "Time", "Val")) 

df$mix <- paste(df$Date, df$Time) 
df$mix <- parse_date_time(df$mix, 'Ymd HMS') 

Sie müssen nur das richtige Format zu ihm füttern. Ich bevorzuge es as.POSICct, weil es viel flexibler ist und Sie andere Funktionen haben, um mit Zeitvariablen zu arbeiten.

Verwandte Themen