如何将数据框中混合格式的Excel日期转换为R可识别日期?
混合格式日期转换解决方案
问题场景
导入的Excel数据框中,Date列同时包含mdY格式字符串和Excel数值型日期(如"35462"),数据结构如下:
data <- structure(list(Date = c("12/31/1996", "35462", "35490", "35582", "35612", "35643", "35674", "35704", "1/13/1997", "1/14/1997", "1/15/1997")), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
尝试转换时使用以下代码报错:
library(tidyverse) library(lubridate) data_fixed <- data %>% mutate(Date = parse_date_time(Date, c('mdY'))) replace(data_fixed, is.na(data_fixed), as.Date(as.integer(data[is.na(data_fixed)]), origin = "1899-12-30"))
报错信息:
Error in `[<-`: ! Subscript `list` is a matrix, the data `values` must have size 1. Run `rlang::last_trace()` to see where the error occurred.
报错原因
data[is.na(data_fixed)]返回的是数据框而非向量,as.integer无法直接处理数据框,导致后续转换失败;replace处理数据框时,is.na(data_fixed)生成的是逻辑矩阵,与要替换的数值向量维度不匹配,触发下标错误。
解决方法
方法1:分情况处理(case_when)
通过正则判断字符串是否为纯数字,分别转换为日期格式:
library(tidyverse) library(lubridate) data_cleaned <- data %>% mutate( # 标记是否为Excel数值型日期 is_excel_date = str_detect(Date, "^\\d+$"), # 分情况转换 Date = case_when( is_excel_date ~ as.Date(as.integer(Date), origin = "1899-12-30"), TRUE ~ mdy(Date) ) ) %>% select(-is_excel_date) # 移除辅助列 # 查看结果 print(data_cleaned)
方法2:直接用parse_date_time匹配多格式
parse_date_time支持同时传入多种格式,自动匹配转换:
data_cleaned2 <- data %>% mutate(Date = parse_date_time(Date, orders = c("mdY", "integer")) %>% as.Date()) print(data_cleaned2)
两种方法最终都会得到统一的Date列(R标准日期格式):
# A tibble: 11 × 1 Date <date> 1 1996-12-31 2 1997-05-19 3 1997-06-06 4 1997-09-06 5 1997-10-06 6 1997-11-06 7 1997-12-07 8 1998-01-06 9 1997-01-13 10 1997-01-14 11 1997-01-15
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

