2013-10-04 126 views
22

將excel表格導入爲ArcGIS中的xy點時,我將繼續失去每個點的正確DateTime標記。因此,我格式化了DateTime序列號,創建了.shp,並使用readOGR()將.shp讀入R中。將excel日期時間序列號轉換爲R日期時間

一旦進入R,我可以使用as.Date()origin = "1899-12-30"參數將其轉換爲正確的日期,但時間會被忽略。雖然我看到了一個單獨的Date的例子,但我還沒有看到過使用DateTime的例子。我一直在使用as.Date()以及as.POSIXct(),但這看似簡單的任務有點令人沮喪,因此後...

我創建了一個示例數據集,其中包含10行正確的DateTime格式以及Excel序列號。

*感謝理查德和thelatemail敏銳的眼光,以前的阻礙。我已更正數據並重新張貼在此處。

這裏是我的樣本數據

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) 

日期時間爲北京時間。時間是24小時時鐘(即不是AM/PM)。我正在使用Windows 7,擁有最新的R和ArcGIS 10.

下面的代碼獲取正確的日期,但時間仍然缺失。

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

在此先感謝!

+1

你可以看看類似的主題[這裏](http://stackoverflow.com/questions/4868693/convert-fraction -of-day-to-posix-times-in-r)和[here](http://stackoverflow.com/questions/12161984/how-to-elegantly-convert-datetime-from-decimal-to-dmy- HMS /)。 – Henrik

回答

34

您的號碼正在計算天數。轉換爲秒,就這麼簡單(少了舍入誤差)

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

感謝里卡多薩波塔和thelatemail提供的信息性建議 –

9

仍然存在,它只是不顯示時間數據 - 見:

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

如果你希望工作部分天,你可能最好使用POSIXct表示。爲此,您可以將其轉換爲Date,然後轉換爲POSIXct,但如果要與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

使用函數ConvertToDateTime。這很簡單。這裏有一個例子:

convertToDateTime(helpData $ ExcelNum,產地= 「1900-01-01」)

讓我知道它是如何工作的。

2

這裏是另一種方式使用看門人和tibble包做到這一點:

install.packages("janitor") 

install.packages("tibble") 

library(tibble) 

library(janitor) 

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern") 
相關問題