使用 read_excel 函数进行 R 日期解析

Rod*_*ero 5 r date readxl

使用 read_excel 函数时,电子表格中 FuelEventDateTime 列中的日期格式为“dd/mm/yyyy hr:mm:ss”(示例:03/05/2019 9:19:00 AM)被解析为格式如下的字符串:示例:43588.849xxxxx(x 为任意数字)。我无法将此列设置为正确的日期类别,并且我不知道该数字的含义,但在 Excel 中见过几次。

\n

试图将“.”分开。在字符串中,将列设置为.numeric,并尝试了 lubridate、R base 和 anydate 库中的几个函数,因为该数字可能是起源“1900-01-01”中纪元格式的日期

\n

读取数据

\n
sys_raw <- read_excel("Advanced Fill-Ups Report 15052019_165240.xlsx", sheet = "Data", col_names = FALSE) \n\ncol_names_sys <- sys_raw[11,] \n\nsys_tidy <- sys_raw[12:ncol(sys_raw),] %>% \n  setNames(col_names_sys) %>% \n  select(DeviceName, FuelEventDateTime,FuelUsedEventDistance)\n
Run Code Online (Sandbox Code Playgroud)\n

注意到字符串是数字,尝试单独的“。” 并设置为数字

\n
sys_tidy <- sys_tidy %>% \n\n  mutate(FuelEventDateTime = str_split(FuelEventDateTime, "\\\\.")) %>% \n\n  separate(FuelEventDateTime, c("c","date","time")) %>% \n\n  separate(DeviceName, c("Device"), sep = "\\\\s") %>% \n\n  select(Device, date, FuelUsedEventDistance) %>% \n\n  mutate(date = as.numeric(date)) \n\nsys_tidy <- sys_tidy %>% \n\n  as.Date(date, origin = "1900-01-01") \n
Run Code Online (Sandbox Code Playgroud)\n

实际结果是错误的,预期结果是日期类格式为“dd/mm/yyyy”的列日期,不需要时间。

\n

错误消息示例:

\n
\n

as.Date.default(., date, origin = "1900-01-01") 中的错误:不知道如何将 \'.\' 转换为类 \xe2\x80\x9cDate\xe2\x80\x9d

\n

as.POSIXct.default(., date, origin = "1900-01-01") 中的错误:不知道如何将 \'.\' 转换为类 \xe2\x80\x9cPOSIXct\xe2\x80\x9d

\n
\n

Jon*_*ing 5

sys_tidy <- sys_tidy %>% 
   as.Date(date, origin = "1900-01-01") 
Run Code Online (Sandbox Code Playgroud)

相当于

sys_tidy <- as.Date(sys_tidy, date, origin = "1900-01-01") 
Run Code Online (Sandbox Code Playgroud)

你可能的意思是

sys_tidy <- sys_tidy %>% 
   mutate(date = as.Date(date, origin = "1900-01-01"))
Run Code Online (Sandbox Code Playgroud)

否则,您将数据框插入到第一项中as.Date,而 R 不知道如何处理它。来自 ?as.Date: as.Date 方法接受字符串、因子、逻辑 NA 以及类“POSIXlt”和“POSIXct”的对象。

mutate,来自dplyr,了解您将使用sys_tidy通过管道输入的数据框 ( )中的一列或多列%>%,并将输出分配给其中调用的列date

基本 R 等效项类似,但要求输入和输出都指定date位于sys_tidy数据框中的列的上下文。

sys_tidy$date = as.Date(sys_tidy$date, origin = "1900-01-01"))
Run Code Online (Sandbox Code Playgroud)