2016-09-30 4 views
0

Ich habe einige numerische aktuelle Daten aus Excel:Umgang mit numerischen (Dezimal) Daten in R?

> df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
> names(df) <- c("Closetime", "Opentime") 

Beide Closetime und Opentimenumeric sind. Ich mag die Stunde/Minute/Sekunde Daten von OpenTime erhalten und die Zeit '00 hinzufügen: 00: 00' zu jedem Zeitpunkt in Closetime:

> df$Closetime <- paste(as.Date(df$Closetime, origin = '1900-01-01'), c('00:00:00')) 

Leicht genug Closetime zu tun, aber wenn ich versuche, mit lubridate::date_decimal auf Opentime, alles geht zur Hölle.

> df$Opentime <- date_decimal(df$Opentime) 
> df 
      Closetime    Opentime 
1 2016-09-02 00:00:00 42614-08-11 15:36:00 
2 2016-09-01 00:00:00 42613-12-21 01:12:00 
3 2016-09-03 00:00:00 42612-02-13 22:04:48 

Wie kann ich beide bekommen Opentime und Closetime vom gleichen Typ/Format sein? Ich suche schließlich, in der Lage zu sein, den Unterschied in Stunden zwischen den Zeiten in jeder Spalte als Referenz zu bekommen.

Antwort

2

Wenn Sie POSIXct verwenden können, können Sie zum Beispiel tun

df$Opentime <- as.POSIXct(df$Opentime*24*60*60, 
       origin="1900-01-01", 
       tz="UTC") 

Reasoning: POSIXct ist gerade Anzahl von Sekunden seit dem Ursprung

+2

Nun, das ist der schlimmste Ansatz der Skalierung von Tagen zu Sekunden als Ihre * lose * zB die paar Sekunden der Anpassung. Die anderen Antworten zeigen, wie man dies richtig macht, indem man die Typen von R verwendet. –

+0

@DirkEddelbuettel Messepunkt, aber vielleicht, wenn Sie alle Zwischenkonvertierungen machen, sollten Sie darauf hinweisen, welchen Zweck das dient. –

+0

Komm wieder? Beziehen Sie sich auf meine Antwort unten? Kannst Du lesen? –

2

Zuerst haben wir die Beratung in Bezug auf help("as.Date") Excel Termine folgen. Ich gehe davon aus hier Windows-Excel:

df$Closetime_p <- as.Date(df$Closetime, origin = "1899-12-30") 
df$Opentime_p <- as.Date(floor(df$Opentime), origin = "1899-12-30") 

Dann wandeln wir POSIXct:

df$Closetime_p <- as.POSIXct(as.POSIXlt(df$Closetime_p, tz = "GMT"), tz = "GMT") 
df$Opentime_p <- as.POSIXct(as.POSIXlt(df$Opentime_p, tz = "GMT"), tz = "GMT") 

Nun fügen wir die Zeit:

df$Opentime_p <- df$Opentime_p + (df$Opentime - floor(df$Opentime)) * 24 * 3600 
# Closetime Opentime Closetime_p   Opentime_p 
#1  42613 42614.61 2016-08-31 2016-09-01 14:38:24 
#2  42612 42613.97 2016-08-30 2016-08-31 23:16:48 
#3  42614 42612.12 2016-09-01 2016-08-30 02:52:48 
1

bisher konvertieren, wie Sie das tun, dann POSIXct konvertieren :

Zuerst erstellen Sie den data.frame (und beachten Sie, wie wir die Spaltennamen festlegen):

R> df <- data.frame(CloseT=c(42613, 42612, 42614), OpenT=c(42614.61, 42613.97, 42612.12)) 
R> df 
    CloseT OpenT 
1 42613 42614.6 
2 42612 42614.0 
3 42614 42612.1 
R> 

konvertieren Dann Datum:

R> df$CloseT <- as.Date(df$CloseT, origin="1900-01-01") 
R> df$OpenT <- as.Date(df$OpenT, origin="1900-01-01") 
R> df 
     CloseT  OpenT 
1 2016-09-02 2016-09-03 
2 2016-09-01 2016-09-02 
3 2016-09-03 2016-09-01 
R> 

Schließlich konvertieren POSIXct:

R> df$OpenT <- as.POSIXct(df$OpenT) 
R> df$CloseT <- as.POSIXct(df$CloseT) 
R> df 
       CloseT    OpenT 
1 2016-09-01 19:00:00 2016-09-03 09:38:24 
2 2016-08-31 19:00:00 2016-09-02 18:16:48 
3 2016-09-02 19:00:00 2016-08-31 21:52:48 
R> 

gehen über POSIXlt ermöglicht es Ihnen, eine Zeitzone einstellen, wie Roland zeigte.

1

Überprüfen Sie die Dokumentation auf date_decimal:

ein POSIXct Objekt, dessen Jahr entspricht dem ganzzahligen Teil der Nachkommastellen.

date <- ymd("2009-02-10") 
decimal <- decimal_date(date) # 2009.11 
date_decimal(decimal) # "2009-02-10 UTC" 

So in Ihrem Beispiel, wird es 42.614 als das Jahr zu interpretieren.

Versuchen Sie mit as.POSIXct. Möglicherweise müssen Sie die Zeitzone angeben, aber wenn Sie nur das Delta benötigen, ist dies nicht erforderlich.Im Folgenden werde ich die Zeitdifferenz berechnet haben:

df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
names(df) <- c("Closetime", "Opentime") 
df$Closetime <- as.POSIXct(as.Date(df$Closetime, origin = '1900-01-01')) 
df$Opentime <- as.POSIXct(as.Date(df$Opentime, origin = '1900-01-01')) 
df$delta <- df$Opentime - df$Closetime 
df 
      Closetime   Opentime  delta 
1 2016-09-01 20:00:00 2016-09-03 10:38:24 1.61 days 
2 2016-08-31 20:00:00 2016-09-02 19:16:48 1.97 days 
3 2016-09-02 20:00:00 2016-08-31 22:52:48 -1.88 days 

auf den Kommentar basiert, wenn Sie das Display die richtige Stunde muss sicherstellen wollen, müssen Sie Zeitzonen richtig passen. Sie können dies nach der Konvertierung in as.POSIXct tun, indem Sie das Attribut tzone setzen.

df <- data.frame(c(42613, 42612, 42614), c(42614.61, 42613.97, 42612.12)) 
names(df) <- c("Closetime", "Opentime") 
df$Closetime <- as.POSIXct(as.Date(df$Closetime, origin = '1900-01-01')) 
df$Opentime <- as.POSIXct(as.Date(df$Opentime, origin = '1900-01-01')) 
attr(df$Closetime, "tzone") <- "GMT" 
attr(df$Opentime, "tzone") <- "GMT" 
df$delta <- df$Opentime - df$Closetime 
df 

    Closetime   Opentime  delta 
1 2016-09-02 2016-09-03 14:38:24 1.61 days 
2 2016-09-01 2016-09-02 23:16:48 1.97 days 
3 2016-09-03 2016-09-01 02:52:48 -1.88 days 
+0

Wenn ich wollte 'Closetime' die Zeit' 00: 00: 00' für alle Werte haben, wie würde ich das tun? Gibt es einen Parameter, den ich angeben muss? – blacksite

+0

Es macht nichts, ich konnte dies erreichen mit 'lubridate :: hour' und Einstellung von' hour (df $ Closetime) <- 0'. – blacksite

+2

Wenn es Ihr Ziel ist, den Unterschied zwischen den beiden zu berechnen, könnte dies Ihre Berechnung zunichte machen. Ich werde bearbeiten, um zu zeigen, wie Sie es in GMT-Zeitzone erzwingen können, so dass "Clostime" ohne eine Stunde bleibt. –

Verwandte Themen