R语言处理含5位数字与字符混合列的日期转换问题
R读取Excel混合类型日期列解决方案
读取阶段规避日期转5位数字的方法
Excel底层以整数序列存储日期(Windows版默认以1899-12-30为起点计数,旧版Mac Excel以1904-01-01为起点),你看到的5位数字就是该底层存储值,读取时通过手动指定列类型即可避免自动转换:
- 用
readxl包读取时,关闭自动类型推断,手动将目标列指定为文本类型:library(readxl) df <- read_excel("你的文件路径.xlsx", col_types = c("date of death" = "text")) - 用
openxlsx包读取时,关闭自动日期检测,指定目标列按字符读取:library(openxlsx) df <- read.xlsx("你的文件路径.xlsx", detectDates = FALSE, colClasses = c("date of death" = "character"))
以上两种方式都会直接读取Excel单元格内展示的格式化文本,不会抓取日期的底层整数值。
已读取为混合字符列的转换方法
如果已经完成读取,得到了数字字符串+文本值混合的列,无需重新读取文件,通过条件判断仅转换数字部分即可,非数字内容会完整保留:
- 用正则匹配列中纯数字格式的内容
- 将匹配到的数字转为R标准日期格式,根据文件来源选择对应日期原点
- 非数字内容(alive、not known、NA等)不做修改
参考转换代码:
library(dplyr) library(stringr) df <- df %>% mutate( `date of death` = case_when( # 识别纯数字内容做日期转换 str_detect(`date of death`, "^\\d+$") ~ as.character( as.Date( as.numeric(`date of death`), origin = "1899-12-30" # 旧版Mac生成的Excel替换为"1904-01-01" ) ), # 其余内容保持原样 TRUE ~ `date of death` ) )
转换后列的效果和你给出的样例对应如下:
#> date of death #> <chr> #> 1 2022-04-25 #> 2 2022-04-26 #> 3 alive #> 4 not known #> 5 NA
校验提示:如果转换后日期和你预期不符,可拿已知对应关系的数字值调整origin参数,直到结果匹配即可。
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

