将excel DateTime序列号转换为R DateTime

B. *_*vis 32 r

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

一旦在RI中可以使用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)
Run Code Online (Sandbox Code Playgroud)

日期时间是GMT.时间是24小时制(即不是AM/PM).我正在使用Windows 7,拥有最新的R和ArcGIS 10.

下面的代码获取正确的日期,但时间仍然缺失.

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

提前致谢!

Ric*_*rta 43

你的号码是数天.转换为秒,你已经全部设置(减去舍入错误)

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
Run Code Online (Sandbox Code Playgroud)


the*_*ail 11

时间数据仍然存在,只是没有显示 - 请参阅:

as.numeric(newDateTime)
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc
Run Code Online (Sandbox Code Playgroud)

如果您希望使用部分时间,您可能最好使用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
Run Code Online (Sandbox Code Playgroud)


小智 8

使用功能convertToDateTime。很简单。这是一个例子:

library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")
Run Code Online (Sandbox Code Playgroud)

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


小智 6

Here is another way to do it using janitor and tibble packages:

install.packages("janitor")

install.packages("tibble")

library(tibble)

library(janitor)

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")
Run Code Online (Sandbox Code Playgroud)