2015-03-13 11 views
7

Ich habe Daten in Form eines Datums zur Angabe des Tages (Format "YYYY-MM-DD", zB "2015-03-11" und die Stunden von der Tag nummeriert (0-23). ​​R-Paket, das Zeitobjekte von Datum und Stunde (Ganzzahl) erstellt

Was ist der bequemste Weg, um Zeit Objekte des Formulars

"2015-03-11" and hour = 0 -> "2015-03-11 00:00" 
"2015-03-11" and hour = 1 -> "2015-03-11 01:00" 
"2015-03-11" and hour = 2 -> "2015-03-11 02:00" 

ich die Datumsfunktion von Basis verwenden könnte oder etwas von xts oder Timedate zu produzieren. Sollte sei einfach, aber ich bin sicher, dass jemand da draußen es schnell kennt.

EDIT: die Daten sind zur Verfügung gestellt in 2 Spalten, eine für das Datum und eine numerische.

+0

Haben Sie eine Zeichenfolge wie '" 2015-03-11 "und Stunde = 0" 'oder sind es zwei Spalten mit' Datum' und numerische Werte von 0-23 in einer anderen? – akrun

+0

2 Spalten - ein Datum und eins Numerisch – Richard

+0

Es funktioniert so, wie Sie vorschlagen, und ich habe eine Zeitzone hinzugefügt, da die Daten aus einer anderen Zeitzone stammen .. Daten sind UTC, ich bin CET as.POSIXct (sprintf ('% s% 02d', '2015-03 -11 ', 2), format ='% Y-% m-% d% H ', tz = "UTC") Danke! – Richard

Antwort

4

Angenommen, wir haben diesen Eingang:

date <- c("2015-03-11", "2015-03-12") 
hour <- 2:3 

dann versuchen, eine davon:

1) chron

library(chron) 
as.chron(date) + hour/24 

geben:

[1] (03/11/15 02:00:00) (03/12/15 03:00:00) 

2) POSIXct .Dieser nutzt nur die Basis von R, keine Pakete:

as.POSIXct(date) + 3600 * hour  

geben, auf meinem System:

[1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT" 

Wenn Sie das Ergebnis in der UTC-Zeitzone verwenden wollten:

as.POSIXct(date, tz = "UTC") + 3600 * hour 

3) lubridate

library(lubridate) 
ymd(date) + hours(hour) 

geben:

[1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC" 

Wenn Sie es in der aktuellen Zeitzone wollen, dann:

ymd(date, tz = "") + hours(hour) 

Beachten Sie, dass die chron Lösung ein Datum/Zeit-Klasse gibt, die Zeitzonen zu beseitigen, die viele Probleme nicht verwenden diese Zeitzonen können verursachen. Die POSIXct- und Lubridate-Lösungen geben das Datum/die Zeit in einer bestimmten Zeitzone wie gezeigt an.

5

Sie benötigen dafür kein externes Paket.
Wenn Ihre Daten in diesem Format:

df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2) 

nur die folgende Funktion anwenden:

format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M") 
2
diese

Versuchen. Sie können es ohne Sekunden formatiert danach format verwenden, wenn Sie es wünschen, obwohl ich glaube, es vorzuziehen ist, es in POSIXct Klasse zu halten, damit Sie es anschliessend manipulieren kann (Hinzufügen Entfernen Tage, Sekunden usw.)

as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H") 
## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST" 

Obwohl, wenn Sie auf Ihrem genauen Ausgang bestehen, hier sind die Lösung mit format

format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M") 
## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00" 

Daten

df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"), 
    V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-3L)) 
3

könnten Sie versuchen,

dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour), 
        format = "%Y-%m-%d %H")) 

und format dann wie in den anderen Beiträgen verwenden

Oder

library(lubridate) 
ymd_h(with(df, sprintf('%s %02d', date, hour))) 

Oder etwas kompakter

ymd_h(do.call(paste, df)) 
+1

@DavidArenburg Dafür muss ich dein 'do.call' stehlen :-) – akrun