You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:16:14