楼主: priss111
9895 13

[问答] 求助:openxlsx读入.xlsx的日期变量,如何将数值日期转换为年月日日期格式? [推广有奖]

11
priss111 发表于 2022-2-21 17:32:09
s609078902 发表于 2022-2-21 14:58
openxlsx::read.xlsx() 有 detectDates = TRUE 参数
另外再请教您个问题:

为啥openxlsx::read_xlsx(..., detectDates = TRUE)读入的数据框所有日期类型自动变为NULL?
谢谢!


说明:data1_, data2_是通过read_xlsx(..., detectDates = TRUE)读入, v8是开始时间。

对data1_, data2_数据框备份为data1, data2,且批量重命名了data1,data2的变量名,
> data1 <- data1_
> data2 <- data2_
> names(data1) <- paste0("V", 1:ncol(data1))
> names(data2) <- paste0("f", 1:ncol(data2))

> class(data1$v8)
[1] "NULL"
> class(data1_$开始时间)   #data1_&开始时间的类型也是NULL,但class()显示的是Date
[1] "Date"

12
s609078902 发表于 2022-2-22 08:36:53
priss111 发表于 2022-2-21 16:12
谢谢回复!

as.date对某列(某个变量一整列)进行操作后,数据集中该变量仍显示日期为数字(如下图)。 ...
你没有赋值给原来的列

13
s609078902 发表于 2022-2-22 08:44:19
priss111 发表于 2022-2-21 17:32
另外再请教您个问题:

为啥openxlsx::read_xlsx(..., detectDates = TRUE)读入的数据框所有日期类 ...
不清楚,可能是你这列里面有些值不是日期,也可能是excel日期转换的问题。你用下面这个代码转换吧
  1. library(lubridate)

  2. data %>%
  3.   mutate(v8 = as_date(v8) +/- days(2),
  4.          开始时间 = as_date(开始时间) +/- days(2))
复制代码

14
priss111 发表于 2022-2-22 09:23:42
s609078902 发表于 2022-2-22 08:44
不清楚,可能是你这列里面有些值不是日期,也可能是excel日期转换的问题。你用下面这个代码转换吧
谢谢回复!

data1_,  data2_中有多个日期变量,
用了openxlsx::read.xlsx(..., detectDates = T)也还是有个别日期会显示为数值(数字),用这句解决:
  1. data1$v8 <- as.Date(ymd("1899-12-30") + ddays(data1_$v8))
复制代码
又请教了其他人:用了readxl:: read_xlsx读入,对有时分秒的日期通过下面字符提取这段代码实现。
  1. data1_ <- as.data.frame(read_excel('data1_.xlsx', sheet = 'data1', col_names = T))
  2. vnames_bak <- names(data1_)
  3. vnames <- vnames_bak[str_detect(vnames_bak, '时间|日期')]
  4. ext_date_f <- function(date_str){
  5.   tmp <- as.character(date_str)
  6.   tmp <- str_extract(tmp, '^\\d{4}\\-\\d{2}\\-\\d{2}')
  7.   ymd(tmp)
  8. }
  9. for (vname in vnames){
  10.   Adult_[, vname] <- ext_date_f(data1_[, vname])
  11.   print(head(unique(data1_[, vname])))
  12.   print(class(data1_[, vname]))
  13.   
  14. }
复制代码
另外:备份后的数据集中的日期变量类型出现NULL,是变量名写错:把V8写成了v8。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-22 23:29