在 xlsx 包的 write.xlsx 中格式化日期

Eri*_*een 5 r xlsx

我正在尝试使用该xlsx包将带有日期列的数据框导出到 Excel 。的帮助文件write.xlsx()说明了格式化日期列的方法。我尝试按照下面的方法进行操作,但生成的 Excel 文件没有显示正确的格式。我可以手动将 Excel 中的单元格格式更改为自定义日期,但这是一个额外的步骤,使其无法重现。

library(lubridate)
library(xlsx)
dat <- data.frame(dates=c("2014-07-16 15:03:16", "2014-07-16 14:52:03", "2014-07-16 16:50:38", "2014-07-12 00:00:00", "2014-07-12 00:00:00"))
dat$dates <- ymd_hms(dat$dates)

wb <- createWorkbook()
saveWorkbook(wb, "output.xlsx")
oldOpt <- options()
options(xlsx.date.format="yyyy-mm-dd HH:mm:ss") # change date format
write.xlsx(dat, 
           "output.xlsx",
           sheetName="output")
options(oldOpt)      # revert back to defaults
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

dig*_*All 5

由于日期列类型是POSIXct,您应该使用xlsx.datetime.format而不是xlsx.date.format(仅对类型为 的列有效Date)。

但是,由于 xlsx 包内的类检查中的错误,它仍然不起作用。实际上,查看代码,它执行以下检查:

indDT <- which(sapply(y, class) == "POSIXct")
Run Code Online (Sandbox Code Playgroud)

失败,因为POSIXct也继承自POSIXt. 也许正确的检查应该是:

indDT <- which(sapply(y, FUN=function(x) any(class(x) == "POSIXct")))
Run Code Online (Sandbox Code Playgroud)

无论如何,您可以通过执行以下操作来解决此问题:

dat$dates <- ymd_hms(dat$dates)
class(dat$dates) <- "POSIXct"
Run Code Online (Sandbox Code Playgroud)

当然还有设置xlsx.datetime.format而不是xlsx.date.format