2013-10-04 13 views
22

Gdy tabele Excela są importowane jako punkty XY w ArcGIS, nadal tracę poprawną pieczęć DateTime dla każdego punktu. Dlatego sformatowałem numer seryjny DateTime, utworzyłem .shp i odczytuję .shp na R używając readOGR().Konwersja Excela Numer seryjny DateTime na R DateTime

Raz w R mogę przekonwertować na prawidłową datę, używając as.Date() i argumentu origin = "1899-12-30", ale czas jest pominięty. Chociaż widziałem przykłady z jedyną datą, nie widziałem pracowanych przykładów z DateTime. Używałem as.Date(), a także as.POSIXct(), ale to pozornie proste zadanie było trochę frustrujące, a więc post ...

Stworzyłem przykładowy zestaw danych z 10 wierszami prawidłowego formatu DateTime, a także numer seryjny programu Excel .

* Dziękuję Richard i thelatail za ich bystre spojrzenie na wcześniejszą przeszkodę. Poprawiłem dane i przeredagowałem je tutaj.

Oto moje dane przykładowe

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) 

DateTime to GMT. Czas jest czasem 24 godzin (tj. Nie jest AM/PM). Pracuję na systemie Windows 7, najnowszym R i ArcGIS 10.

Poniższy kod pobiera poprawną datę, ale czasu nadal brakuje.

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

Z góry dziękuję!

+1

Można spojrzeć na podobne tematy [tutaj] (http://stackoverflow.com/questions/4868693/convert-fraction -of-day-to-posix-times-in-r) i [tutaj] (http://stackoverflow.com/questions/12161984/how-to-elegantly-convert-datetime- from-decimal-to-dmy- hms /). – Henrik

Odpowiedz

34

Twój numer to liczba dni. Konwersja do sekundy, a ty cały zestaw (mniej zaokrąglania błędu)

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

Podziękowania dla Ricardo Saporta i wiadomość e-mail z sugestiami –

9

Dane czas jest nadal istnieje, to po prostu nie wyświetlany - patrz:

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

Jeśli chcą pracować z częściami dni najprawdopodobniej najlepiej używać reprezentacji POSIXct. Aby to zrobić, możesz przekonwertować na Date, a następnie przekonwertować na POSIXct, ale spowoduje to problemy z strefą czasową gry, jeśli chcesz wykonać bezpośrednie porównanie z kolumną 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

Użyj funkcji ConvertToDateTime. To proste. Oto przykład:

convertToDateTime (helpData $ ExcelNum, pochodzenie = "1900-01-01")

Daj mi znać, jak to działa.

2

Oto kolejny sposób to zrobić przy użyciu woźny i tibble pakiety:

install.packages("janitor") 

install.packages("tibble") 

library(tibble) 

library(janitor) 

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