当excel表在ArcGIS中作为xy点导入时,我继续丢失每个点的正确DateTime标记。因此,我已经格式化了DateTime序列号,创建了.shp,并使用readOGR()将.shp读入R..
一旦进入R,我可以使用as.Date()
和origin = "1899-12-30"
参数转换为正确的日期,但时间会被遗漏。虽然我已经看到了具有唯一Date的示例,但我还没有看到DateTime的工作示例。我一直在使用as.Date()
以及as.POSIXct()
,但这个看似简单的任务有点令人沮丧,因此帖子......
我创建了一个样本数据集,其中包含10行正确的DateTime格式以及excel序列号。
*感谢Richard和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)
DateTime是GMT。时间是24小时(即不是AM / PM)。我正在使用Windows 7,拥有最新的R和ArcGIS 10。
以下代码获取正确的日期,但时间仍然缺失。
newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30")
head(newDateTime)
提前致谢!
答案 0 :(得分:42)
你的号码是数天。转换为秒,并且您已全部设置(减去舍入误差)
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
答案 1 :(得分:11)
时间数据仍然存在,只是没有显示 - 请参阅:
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 :(得分:6)
使用函数convertToDateTime
。它很直接。这是一个例子:
library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")
让我知道它是如何运作的。
答案 3 :(得分:3)
以下是使用janitor和tibble包的另一种方法:
install.packages("janitor")
install.packages("tibble")
library(tibble)
library(janitor)
excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")
答案 4 :(得分:1)
另一个变种:
library("datetimeutils")
convert_date(helpData$ExcelNum, type = "Excel")
## [1] "2011-03-04" "2011-03-11" "2011-03-13" "2011-03-14" "2011-03-14"
## [6] "2011-03-14" "2011-03-15" "2011-03-17" "2011-03-18" "2011-03-18"
convert_date(helpData$ExcelNum, type = "Excel", fraction = TRUE)
## [1] "2011-03-04 06:00:00 CET" "2011-03-11 07:54:59 CET"
## [3] "2011-03-13 07:54:59 CET" "2011-03-14 00:00:00 CET"
## [5] "2011-03-14 10:03:59 CET" "2011-03-14 07:54:59 CET"
## [7] "2011-03-15 19:54:59 CET" "2011-03-17 07:54:59 CET"
## [9] "2011-03-18 04:03:59 CET" "2011-03-18 04:03:59 CET"