将excel DateTime序列号转换为R DateTime

当Excel表格导入为ArcGIS中的xy点时,我将继续丢失每个点的正确DateTime标记。 因此,我已经格式化了DateTime序列号,创build了.shp,并使用readOGR()将.shp读入到R中。

一旦在RI可以使用as.Date()origin = "1899-12-30"参数转换为正确的date,但时间被省略。 虽然我看到一个单一的date的例子,我还没有看到与DateTime的例子。 我一直在使用as.Date()以及as.POSIXct()但这看似简单的任务有点令人沮丧,因此后…

我创build了一个具有10行正确date时间格式以及Excel序列号的示例数据集。

*感谢Richard和themailmail敏锐的注意力。 我已经更正了数据并重新发布在这里。

这是我的样本数据

 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是GMT。 时间是24小时制(即不是AM / PM)。 我正在使用Windows 7,拥有最新的R和ArcGIS 10。

下面的代码得到正确的date,但时间仍然是缺less的。

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

提前致谢!

你的号码正在计算天数。 转换为秒,你就全部设置(更小的舍入误差)

 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 

时间数据仍然存在,它只是不显示 – 请参阅:

 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 

使用ConvertToDateTime函数。 这很简单。 这是一个例子:

convertToDateTime(helpData $ ExcelNum,origin =“1900-01-01”)

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

这是另一种使用看门人和咬肉包的方法:

 install.packages("janitor") install.packages("tibble") library(tibble) library(janitor) excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")