2015-03-13 10 views
7

Ho dati forniti sotto forma di una data che indica il giorno (formato "AAAA-MM-GG", ad es. "2015-03-11" e le ore di il giorno numerata (0-23). ​​Pacchetto R che costruisce oggetti temporali dalla data e dall'ora (numero intero)

Qual è il modo più conveniente per produrre oggetti di tempo del modulo

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

ho potuto utilizzare la funzione Data a partire dalla base o qualcosa da XTS o TimeDate. Dovrebbe sii facile ma sono sicuro che qualcuno là fuori lo sa subito.

EDIT: i dati sono fornito in 2 colonne, una per la data e una numerica.

+0

Hai una stringa come "" 2015-03-11 "e ora = 0" 'oppure due colonne con' date' e valori numerici da 0-23 in un altro? – akrun

+0

2 colonne: una data e una numerico – Richard

+0

Funziona come proposto e ho aggiunto un fuso orario in quanto i dati provengono da un fuso orario diverso. I dati sono UTC, I am CET as.POSIXct (sprintf ('% s% 02d', '2015-03 -11 ', 2), formato ='% Y-% m-% d% H ', tz = "UTC"). Grazie! – Richard

risposta

4

Supponiamo di avere questo ingresso:

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

quindi provare uno di questi:

1) Chron

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

dando:

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

2) POSIXct .Questo si usa solo la base di R, nessun pacchetto:

as.POSIXct(date) + 3600 * hour  

dare, sul mio sistema:

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

Se si voleva il risultato nell'uso UTC fuso orario:

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

3) lubridate

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

dono:

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

Se si desidera che nel fuso orario corrente quindi:

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

nota che la soluzione chron dà una classe di data/ora che non utilizza i fusi orari eliminando i tanti problemi che i fusi orari possono causare. Le soluzioni POSIXct e lubridate forniscono la data/ora in un fuso orario specifico come mostrato.

5

Non è necessario un pacchetto esterno per farlo.
Se i dati sono in questo formato:

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

applicano solo le seguenti funzioni:

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

Prova questa. È possibile formattare senza secondi dopo che utilizzano format se lo si desidera, anche se penso che sia preferibile tenerlo in POSIXct classe in modo da poter manipolare afterwords (aggiungendo la rimozione di giorni, secondi, ecc)

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" 

Anche se, Se ti ostini a vostra uscita esatta, ecco la soluzione con 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" 

dati

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

Si potrebbe provare

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

e quindi utilizzare format come negli altri posti

O

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

o leggermente più compatto

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

@DavidArenburg Per quello, devo rubare il tuo 'do.call' :-) – akrun