使用 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读取数据
\nsys_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注意到字符串是数字,尝试单独的“。” 并设置为数字
\nsys_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\nas.Date.default(., date, origin = "1900-01-01") 中的错误:不知道如何将 \'.\' 转换为类 \xe2\x80\x9cDate\xe2\x80\x9d
\nas.POSIXct.default(., date, origin = "1900-01-01") 中的错误:不知道如何将 \'.\' 转换为类 \xe2\x80\x9cPOSIXct\xe2\x80\x9d
\n
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)