2017-08-19 3 views
0

Ich habe einen Datenrahmen im Zeitformat. Ich muss es in numerische Daten ändern. Ich habe das folgende Format verwendet, aber ich bin mir nicht sicher, ob es korrekt ist, da sich die Werte im numerischen Format ändern.Zeitdatenrahmen in numerische Daten umwandeln

Photoperiod 
08:52:41 
08:53:35 
08:54:33 
08:55:36 
08:56:44 
08:57:55 
08:59:11 
09:00:31 
09:01:55 
09:03:23 
09:04:55 
09:06:31 
09:08:10 
09:09:53 
09:11:40 

DF<- read.csv2(file="DF.csv") 
DF.a <-as.POSIXct(DF, format = "%H:%M:%S") 

library(data.table) 

DF.B<- lapply(DF.a , function(x) as.numeric(as.ITime(x))/3600) 
+1

Wo ist das Problem? Die ersten beiden Male haben einen Unterschied von ~ 1 Minute. Dies ist 1/60 ~ 0,016. Wenn Sie den Unterschied zwischen den ersten zwei Mal betrachten, ist es 0,015. –

+1

Welche Werte haben Sie erwartet? Die Funktion 'as.numeric (as.ITime (x))/3600' würde Zeit in Bezug auf die Anzahl der Stunden (bis zu 24) geben. Sie können zum Beispiel überprüfen, dass 'as.numeric (as.ITime (" 12:00:00 "))/3600' 12 zurückgibt,' as.numeric (as.ITime ("23:59:59"))/3600 'gibt 23.99972, usw. zurück. –

+0

Mein Datenrahmen ist die Tageslichtdaten, also 14:25:30 bedeutet 14 Stunden und 25 Minuten Tageslicht, ich weiß nicht, ob ich as.numeric (as.ITime (x))/3600 benutze, zerstöre meine Daten oder nicht. Nur verwirrt werden. – Mori

Antwort

2

A (sehr) ähnliche Frage gestern in der SO in portuguese gefragt wurde. Die Antwort von Marcus Nunes kann geben, was Sie wollen.

Beachten Sie, dass er die Funktion HoraDecimal, Portugiesisch für 'DecimalHour' aufruft.

HoraDecimal <- function(x){ 
    sum(unlist(lapply(strsplit(x, split=":"), as.numeric)) * c(1, 1/60, 1/3600)) 
} 

x <- "02:20:00" 
HoraDecimal(x) 
[1] 2.333333 

y <- "00:50:00" 
HoraDecimal(y) 
[1] 0.8333333 

z <- "3:30:30" 
HoraDecimal(z) 
[1] 3.508333 

Ich habe einen Vorschlag in den Kommentaren gemacht, sapply statt unlist(lapply(...)) zu verwenden. Das Folgende ist eine solche Version. Der Name wurde in Englisch geändert.

DecimalHour <- function(x){ 
    sum(sapply(strsplit(x, split=":"), as.numeric) * c(1, 1/60, 1/3600)) 
} 

DecimalHour(x) 
DecimalHour(y) 
DecimalHour(z) 

Die Konvertierungsmethode ist die gleiche, es ist immer noch Marcus 'Funktion und wenn Sie es nützlich finden, sollten die Credits zu ihm gehen.

+0

Würde nicht bei '% *% 'hier arbeiten – akrun

+0

@akrun Die Matrix multiplizieren gibt eine' Matrix' zurück. Ich glaube nicht, dass das das OP will. –

Verwandte Themen