2015-03-13 32 views
7

Mam dane podane w formie daty z informacją o dniu (format "RRRR-MM-DD", np. "2015-03-11" i godziny dzień numerem (0-23). ​​Obiekt pakietu R budujący obiekty z datą i godziną (liczbą całkowitą)

Co jest najwygodniejszym sposobem wytwarzania przedmiotów porze formie

"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" 

mogę korzystać z funkcji Data od podstawy albo coś z XTS lub timeDate. Gdyby być łatwym, ale jestem pewien, że ktoś tam to szybko wie.

EDYCJA: dane są dostarczone w 2 kolumnach, jedna dla daty i jedna numeryczna.

+0

Czy masz ciąg znaków typu '" 2015-03-11 "i godzinę = 0" 'czy jest to dwie kolumny z' datą' i wartościami numerycznymi od 0 do 23 w innej? – akrun

+0

2 kolumny - jedna data i jedna numeryczny: – Richard

+0

Działa tak, jak proponujesz, i dodałem strefę czasową, ponieważ dane pochodzą z innej strefy czasowej Dane to UTC, jestem CET as.POSIXct (sprintf ('% s% 02d', '2015-03 -11 ', 2), format ='% Y-% m-% d% H ', tz = "UTC") Dzięki! – Richard

Odpowiedz

4

Załóżmy, że mamy to wejście:

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

należy spróbować jednego z nich:

1) Kron

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

podaniem:

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

2) POSIXct .Ten jeden jedyny wykorzystuje bazę R, brak pakiety:

as.POSIXct(date) + 3600 * hour  

podając, w moim systemie:

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

Jeśli chciałeś wynik w wykorzystaniu Strefa czasowa UTC:

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

3) lubridate

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

dawanie:

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

Jeśli chcesz go w aktualnej strefy czasowej następnie:

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

Należy zauważyć, że rozwiązanie Kron daje klasę data/czas, który nie korzysta strefy czasowe wyeliminowanie wielu problemów te strefy czasowe mogą powodować. Rozwiązania POSIXct i lubryate podają datę/czas w określonej strefie czasowej, jak pokazano.

5

Nie potrzebujesz do tego zewnętrznej paczki.
Jeśli dane są w formacie:

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

prostu zastosować następującą funkcję:

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

spróbować. Można go sformatować bez sekund później z wykorzystaniem format jeśli chcesz, chociaż myślę, że lepiej jest, aby utrzymać go w POSIXct klasy, dzięki czemu można manipulować posłowia (dodawanie usuwanie dzień, sekundy, itd.)

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" 

Chociaż, Jeśli upierasz się na dokładnym wyjścia, oto rozwiązanie z 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" 

danych

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

Można spróbować

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

a następnie użyć format jak w innych postach

Albo

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

lub nieco bardziej zwarty

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

@DavidArenburg Do tego, muszę ukraść twoją 'do.call' :-) – akrun