2016-05-05 71 views
5

Ho una serie di set di dati da una sonda di monitoraggio continuo di qualità dell'acqua con Data e ora impostati in Eastern Standard Time (EST) quindi non c'è correzione dell'ora legale (EDT). In R, i campi vengono riconosciuti come fattori durante l'importazione della tabella dati da un database di accesso MS, tuttavia quando la conversione utilizzando as.POSIXct() date e orari da 02:00 (24 clock) del 2016-03-13 diventa NA. Ciò è dovuto al passaggio da EST a EDT ... pertanto, tecnicamente, 2016-03-13 02:00 non esiste.Gestione dell'ora legale orientale (EST) e dell'ora legale orientale (EDT) in R

Alcuni dati creato come esempio

test<-data.frame(Date=rep(as.Date("2016-03-13"),120),Hour=rep(seq(0,23,1),5),Min=rep(seq(0,60,15),24))

C'è un modo per convertire il fattore o il campo di caratteri come campo POSIXct pur mantenendo la denominazione fuso orario EST? In alternativa esiste un modo per identificare e convertire la data e l'ora corrette in EST e EDT?

Sono andato in giro e non riesco a far funzionare nulla. Ho provato a convertire in GMT (o UTC) e poi riconvertire in EST (tz = "America/New_York"). Mi rendo conto che questo è un problema in corso e le persone che lavorano con dati di data e ora, in particolare in R, vorrebbe allontanarsi da EDT.

Qualsiasi aiuto è apprezzato ... Sono alla mia intelligenza fine su questo.

+0

Penso di aver trovato un lavoro in giro, ma non ne sono sicuro al 100%. Quando si converte datetime da un fattore o carattere a un campo POSIXct, l'uso di tz = "Etc/GMT-5" sembra funzionare ... ma non sono ancora sicuro. Qualsiasi direzione o consiglio è benvenuta. Esempio di codice qui sotto. 'test <-data.frame (Date = rep (as.Date (" 2016-03-13 "), 96), Hour = rep (seq (0,23,1), each = 4), Min = rep (seq (0,45,15))) ' ' as.POSIXct (incolla (prova $ Data, prova $ Ora, prova $ Min), formato = "% Y-% m-% d% H% M ", tz =" Etc/GMT-5 ")' –

risposta

3

Il problema con l'utilizzo di POSIX tz = "America/New_York" è rappresentato dall'ora legale (UTC-4 o UTC-5), anche se i timestamp sottostanti sono memorizzati negli Stati Uniti Eastern Standard Time (UTC-5).

Dovresti essere in grado di designare il tuo tz come Etc/GMT+5. Da lì, è facile convertire tra EST, ora locale orientale e GMT. Si noti che in R, i fusi orari a ovest di UTC sono contrassegnati da un offset positivo (vedere la documentazione relativa ai nomi di fuso orario in ?timezone).

Ecco alcuni dati di esempio (l'ora legale è entrato in vigore alle 02:00 Eastern Time on 3/16/16):

StartTime=as.numeric(as.POSIXct("2016-03-11 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5")) 
EndTime=as.numeric(as.POSIXct("2016-03-15 0:00:00",format="%Y-%m-%d %H:%M",origin="1970-01-01",tz="Etc/GMT+5")) 

Interval=15*60 #15-min 
data.EST=as.POSIXct(seq(from = StartTime,to = EndTime, by=Interval),origin="1970-01-01",tz="Etc/GMT+5") #generate date stamps 

# convert Eastern Standard Time (in R: GMT+5) to local time (accounts for daylight savings): 
data.EastCoast<- format(data.EST, tz="America/New_York") 

# convert Eastern Standard Time (in R: GMT+5) to UTC/GMT: 
data.UTC<- format(data.EST, tz="GMT") 

compare.times<-data.frame(data.EST,data.EastCoast,data.UTC) 

compare.times[(198:203),] 

       data.EST  data.EastCoast   data.UTC 
198 2016-03-13 01:15:00 2016-03-13 01:15:00 2016-03-13 06:15:00 
199 2016-03-13 01:30:00 2016-03-13 01:30:00 2016-03-13 06:30:00 
200 2016-03-13 01:45:00 2016-03-13 01:45:00 2016-03-13 06:45:00 
201 2016-03-13 02:00:00 2016-03-13 03:00:00 2016-03-13 07:00:00 
202 2016-03-13 02:15:00 2016-03-13 03:15:00 2016-03-13 07:15:00 
203 2016-03-13 02:30:00 2016-03-13 03:30:00 2016-03-13 07:30:00 

Buona fortuna!

1

Durante la conversione in POSIX è necessario specificare il fuso orario. Vedere questo esempio:

test<-data.frame(Date=rep(as.Date("2016-03-13"),96),Hour=rep(seq(0,23,1), each=4),Min=rep(seq(0,45,15))) 
wrong<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M") 
ans<-as.POSIXct(paste(test$Date, test$Hour, test$Min), format="%Y-%m-%d %H %M", tz="EST") 

compare<-cbind(test, wrong, ans) 

nel vettore di "sbagliato", senza fuso orario è stato specificato così la NA, ma nel secondo caso è stato specificato Eastern Standard e il risultato desiderato è dato.

+0

Grazie per la risposta, ho letto alcuni documenti in conflitto per indicare che "EST" in R si riferisce a "Australian Eastern Standard Time" e non a North American/Canadian " Eastern Standard Time ". Questo fa una grande differenza poiché "Australian Eastern Standard Time" è UTC-10 e "Eastern Standard Time" è UTC-5. Sono solo nel complesso confuso riguardo alla notazione del fuso orario a volte perché ci sono così tante informazioni là fuori. Qualsiasi punto sarebbe apprezzato. –

+0

Vedere? Timezones e OlsonNames() per l'elenco dei possibili fusi orari. Sono sulla costa orientale e gestisco Sys.time() restituisce - "EDT" – Dave2e

+0

Grazie, sono anche in esecuzione sulla costa orientale degli Stati Uniti e ho fatto Sys.time() e ottenuto EDT. Grazie per la guida agli annunci di input. –