2013-10-04 14 views
22

Quando le tabelle excel vengono importate come punti xy in ArcGIS, continuo a perdere il timbro DateTime corretto per ogni punto. Pertanto, ho formattato il numero di serie di DateTime, creato il file .shp e letto il file .shp in R usando readOGR().Conversione del numero seriale excel DateTime su R DateTime

Una volta in R, è possibile eseguire la conversione alla data corretta utilizzando as.Date() e l'argomento origin = "1899-12-30", ma l'ora è trascurata. Mentre ho visto esempi con un solo Date, non ho visto esempi funzionati con DateTime. Sono stato con as.Date() così come as.POSIXct() ma questo apparentemente semplice compito come stato un po 'frustrante, così il post ...

Ho creato un insieme di dati di esempio con 10 file di formato DateTime corretto così come il numero di serie di Excel .

* Grazie a Richard e alla posta elettronica per il loro occhio acuto su un precedente ostacolo. Ho corretto i dati e ripubblicato qui.

Ecco i miei dati di esempio

helpData <- structure(list(ID = 1:10, DateTime = structure(c(9L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 8L), .Label = c("3/11/2011 7:55", "3/13/2011 7:55", 
"3/14/2011 0:00", "3/14/2011 10:04", "3/14/2011 7:55", "3/15/2011 19:55", 
"3/17/2011 7:55", "3/18/2011 4:04", "3/4/2011 6:00"), class = "factor"), 
ExcelNum = c(40606.25, 40613.32986, 40615.32986, 40616, 40616.41944, 
40616.32986, 40617.82986, 40619.32986, 40620.16944, 40620.16944 
)), .Names = c("ID", "DateTime", "ExcelNum"), class = "data.frame", row.names = c(NA, 
-10L)) 

head(helpData) 

Il DateTime è GMT. L'ora è un orologio di 24 ore (cioè non AM/PM). Sto lavorando su Windows 7, ho il più recente R, e ArcGIS 10.

Il codice seguente ottiene la data corretta, ma manca ancora il tempo.

newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30") 
head(newDateTime) 

Grazie in anticipo!

+1

Si può avere uno sguardo a simili argomenti [qui] (http://stackoverflow.com/questions/4868693/convert-fraction -of-day-to-posix-times-in-r) e [qui] (http://stackoverflow.com/questions/12161984/how-to-elegantly-convert-datetime-from-decimal-to-dmy- HMS /). – Henrik

risposta

34

Il numero sta contando i giorni. Converti in secondi, e siete a posto (meno un errore di arrotondamento)

helpData[["ExcelDate"]] <- 
    as.POSIXct(helpData[["ExcelNum"]] * (60*60*24) 
    , origin="1899-12-30" 
    , tz="GMT") 


#  ID  DateTime ExcelNum   ExcelDate 
# 1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00 
# 2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59 
# 3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59 
# 4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00 
# 5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59 
# 6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59 
# 7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59 
# 8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59 
# 9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
# 10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
+0

Grazie a Ricardo Saporta e la posta elettronica per i suggerimenti informativi –

9

I dati di tempo è ancora lì, è solo non visualizzato - vedi:

as.numeric(newDateTime) 
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc 

Se si desiderano lavorare con parti di giorni, probabilmente stai usando al meglio le rappresentazioni POSIXct. Per fare ciò, è possibile convertire in Date, quindi convertire in POSIXct, anche se questo mette in gioco problemi di fuso orario se si vuole fare un confronto diretto con la colonna DateTime.

helpData$newDate <- as.POSIXct(as.Date(helpData$ExcelNum,origin="1899-12-30")) 
attr(helpData$newDate,"tzone") <- "UTC" 
helpData 

# ID  DateTime ExcelNum    newDate 
#1 1 3/4/2011 6:00 40606.25 2011-03-04 06:00:00 
#2 2 3/11/2011 7:55 40613.33 2011-03-11 07:54:59 
#3 3 3/13/2011 7:55 40615.33 2011-03-13 07:54:59 
#4 4 3/14/2011 0:00 40616.00 2011-03-14 00:00:00 
#5 5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59 
#6 6 3/14/2011 7:55 40616.33 2011-03-14 07:54:59 
#7 7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59 
#8 8 3/17/2011 7:55 40619.33 2011-03-17 07:54:59 
#9 9 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
#10 10 3/18/2011 4:04 40620.17 2011-03-18 04:03:59 
2

Utilizzare la funzione ConvertToDateTime. È semplice. Ecco un esempio:

ConvertToDateTime (helpData $ ExcelNum, origine = "1900-01-01")

Fammi sapere come funziona.

2

Ecco un altro modo per farlo utilizzando custode e Tibble pacchetti:

install.packages("janitor") 

install.packages("tibble") 

library(tibble) 

library(janitor) 

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern") 
Problemi correlati