问题是,当我使用read.xlsxfrom openxlsxpackage从 Excel 工作表读取到 R 时,该TIME列被转换为分数。
这是一个例子,
dfin <-
DATE TIME
15/02/2015 8:00 AM
22/01/2014 10:00 PM
library(openxlsx)
test <- read.xlsx("dfin.xlsx", sheet = 1,
detectDates=TRUE, skipEmptyRows = TRUE,
skipEmptyCols = TRUE, rows = NULL, cols = NULL, check.names = FALSE,
namedRegion = NULL, na.strings = "NA", fillMergedCells = FALSE)
Run Code Online (Sandbox Code Playgroud)
输出:
DATE TIME
2015-02-15 0.3333333
2014-01-22 0.9166667
Run Code Online (Sandbox Code Playgroud)
我不确定它为什么会这样做,以及是否有办法解决这个问题,因为我需要同时使用 DATE 和 TIME 来进行一些计算。
小智 8
R 实际上没有时间格式,所以我建议使用 using 来读取它read_excel,它会自动检测列类型。这会将其转换为带有随机日期的日期时间格式,然后您可以将其删除,然后再将其转换为正确的时间戳。
library(readxl)
library(lubridate)
test <- read_excel('dfin.xlsx',trim_ws = TRUE) %>%
#return the TIME column to the way it is written in Excel
mutate(TIME = as.character(gsub(".* ","",TIME)),
#format the date column
DATE = dmy(DATE),
#turn it into a timestamp
TIMESTAMP = as.POSIXct(paste(DATE,TIME)))
Run Code Online (Sandbox Code Playgroud)
我的第一个猜测是,read.xlsx()在读取文件时尝试猜测 .xlsx 中的日期列,并奇怪地将时间从%I:%M %p格式转换为 24 小时的小数部分(因为例如0.3333333 * 24 = 7.999999 正好是 8.0)。但后来我注意到,如果我将参数更改detectDates为FALSE没有任何真正变化 - 它会输出相同的数据帧。所以它什么也没猜测,只是按TIME原样读取。
如果您尝试在 Excel 工作簿中进行编辑10:00 PM,您会发现它实际上存储为22:00:00. 那么为什么最后它被表示为 的一小部分24?!我不知道,希望有人能解释一下。
与.相比,@Randall 方法确实是一个很好的选择openxlsx::read.xlsx()。请注意,read_xlsx()识别TIME为%H:%M:%S,并将其转换为虚拟POSIXct/POSIXt对象,即1899-12-31 08:00:00和1899-12-31 22:00:00。
令人惊讶的是,read_xlsx()它无法识别它的DATE格式%d-%m-%Y,并将其解释为character. 这意味着我们需要将两个变量转换为适当的格式以获得所需的输出。
我认为我们不需要使用gsub从对象获取 12 小时时钟时间POSIXct,它很容易用于format此目的。DATE从%d-%m-%Y到格式的转换%Y-%m-%d甚至是一个更容易的任务:
library(dplyr)\nlibrary(readxl)\n\nread_xlsx("myfile.xlsx") |>\n mutate(\n DATE = as.Date(DATE, "%d/%m/%Y"), \n TIME = format(TIME, "%I:%M %p") # \xe2\x80\x9cThat\xe2\x80\x99s what I do: I drink and I know things.\xe2\x80\x9d\n )\nRun Code Online (Sandbox Code Playgroud)\n其产生:
\n# A tibble: 2 x 2\n DATE TIME \n <date> <chr> \n1 2015-02-15 08:00 AM\n2 2014-01-22 10:00 PM\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3852 次 |
| 最近记录: |