2013-04-30 12 views
12

Mam plik danych, który ma trzy kolumny tak:R - konwersja daty i czasu do pól POSIXct z formatem GGMMSS

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

Ponieważ jest dość oczywiste dla ludzkich oczu, pierwsze dwa są data i czas. Muszę przekonwertować je na POSIXct (lub coś innego, jeśli jest lepiej, ale moje ograniczone doświadczenie w radzeniu sobie z sygnaturami czasowymi w R jest używanie POSIXct). Normalnie, po wyciągnął go z read.table, użyłbym:

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

Jednak druga kolumna wydaje się tracić swoje zer, a więc to nie działa prawidłowo (prawdopodobnie poprzez rodzaj przymusu?) .

Spojrzałem na Combine date as integer and time as factor to POSIXct in R i Converting two columns of date and time data to one, ale oba używają czasów z ogranicznikami, takich jak:, a więc nie mają tego samego problemu.

Jak mogę przekonwertować te kolumny na POSIXct?

Odpowiedz

16

Byłeś bardzo blisko. Następujące "po prostu" zmusza pierwsze dwie kolumny do odczytywania jako ciągi znaków, które zapisują początkowe zera.

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 

Teraz co próbowali "po prostu działa":

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

Wystarczy zaimportować dane jako znak:

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

Dzięki. Przyjmuję odpowiedź, która była pierwsza, ale jest to zasadniczo to samo :-) – Flyto

1

prostu można użyć lubridate pakiet, który jest super niesamowity i szybki. dla twojego celu spróbuj tego:

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') 

Wystarczy, że podasz do niego prawidłowy format. Wolę go od as.POSICct, ponieważ jest bardziej elastyczny i masz inne funkcje do pracy ze zmiennymi czasowymi.

Powiązane problemy