Excel导入R时dd/mm/yy日期被误识别的修正方法问询
解决Excel混乱日期的R转换问题
问题根源是Excel将你输入的dd/mm/yy格式日期错误解析为mm/dd/yy,并存储为对应的序列值,导入R后直接转换会得到日月颠倒的错误日期。以下是两种可行的解决方法:
方法一:导入后修正数值型日期
加载dplyr和lubridate包,先将数值转换为Excel识别的错误日期,再交换日和月得到正确值,同时保留字符型日期的解析逻辑:
library(dplyr) library(lubridate) df_dl2 <- df_dl %>% mutate(across(c(`specimen taken`, `specimen received at NHL`), function(x) { case_when( # 处理数值型日期:先转错误日期,再交换日月 grepl("^[0-9\\.]+$", x) ~ { wrong_date <- as.numeric(x) |> as_date(origin = "1899-12-30") make_date(year(wrong_date), day(wrong_date), month(wrong_date)) |> as_datetime() }, # 处理dd-mm-YYYY格式的字符型日期 TRUE ~ as_datetime(x, format = "%d-%m-%Y") ) }, .names = "cleaned_{.col}"))
方法二:先以文本格式导入再统一处理
导入时指定日期列为文本类型,避免自动转为数值,再用lubridate::dmy()自动识别多种dd/mm格式的日期文本:
# 以文本格式导入日期列 df_dl <- rio::read("你的文件路径.xlsx", col_types = list(`specimen taken` = "text", `specimen received at NHL` = "text")) # 统一处理文本型日期 df_dl2 <- df_dl %>% mutate(across(c(`specimen taken`, `specimen received at NHL`), function(x) { case_when( # 处理文本形式的Excel序列值 grepl("^[0-9\\.]+$", x) ~ { wrong_date <- as.numeric(x) |> as_date(origin = "1899-12-30") make_date(year(wrong_date), day(wrong_date), month(wrong_date)) |> as_datetime() }, # 自动识别dd/mm/yy、dd-mm-YYYY等格式 grepl("^\\d{2}[-/]\\d{2}[-/]\\d{2,4}$", x) ~ dmy(x) |> as_datetime(), # 无法识别的格式返回缺失值 TRUE ~ NA_datetime_ ) }, .names = "cleaned_{.col}"))
说明:
case_when比ifelse逻辑更清晰,支持多条件分支。dmy()函数无需手动指定格式,能兼容斜杠/横线分隔的dd/mm类日期文本。
内容的提问来源于stack exchange,提问作者Rstudyer
相关产品推荐
相关产品推荐

