R语言:将特定格式字符日期列转为日期类型且避免生成NA值
问题描述
现有如下结构的R数据框,其中Start_Date和End_Date为字符型日期列,尝试转换为日期类型时部分值出现NA,期望最终输出格式为mm/dd/yyyy:
structure(list(Start_Date = c("Dec 12, 2017", "Oct 19, 2022","Oct 3, 2022"), End_Date = c("Dec 25, 2017", "Dec 19, 2022", "Dec 1, 2022"), Completion = c("100% completed", "34% completed", "62% completed")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
解决方案
出现NA的核心原因是日期格式指定错误——未兼容日部分为单数字的情况(如Oct 3, 2022),以下两种方法可完美解决:
方法1:使用lubridate包(推荐)
lubridate能自动识别多种日期格式,无需手动匹配格式字符串,对单/双数字日期均兼容:
# 安装并加载包 install.packages("lubridate") library(lubridate) # 加载数据 df <- structure(list(Start_Date = c("Dec 12, 2017", "Oct 19, 2022","Oct 3, 2022"), End_Date = c("Dec 25, 2017", "Dec 19, 2022", "Dec 1, 2022"), Completion = c("100% completed", "34% completed", "62% completed")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame")) # 转换为日期类型 df$Start_Date <- mdy(df$Start_Date) df$End_Date <- mdy(df$End_Date) # 若需转为`mm/dd/yyyy`字符格式,执行以下步骤 df$Start_Date <- format(df$Start_Date, "%m/%d/%Y") df$End_Date <- format(df$End_Date, "%m/%d/%Y")
方法2:使用base R的as.Date函数
需指定正确的格式字符串:%b匹配月份缩写,%d兼容单/双数字日,%Y匹配4位年份:
# 加载数据 df <- structure(list(Start_Date = c("Dec 12, 2017", "Oct 19, 2022","Oct 3, 2022"), End_Date = c("Dec 25, 2017", "Dec 19, 2022", "Dec 1, 2022"), Completion = c("100% completed", "34% completed", "62% completed")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame")) # 转换为日期类型 df$Start_Date <- as.Date(df$Start_Date, format = "%b %d, %Y") df$End_Date <- as.Date(df$End_Date, format = "%b %d, %Y") # 格式化为`mm/dd/yyyy`字符格式 df$Start_Date <- format(df$Start_Date, "%m/%d/%Y") df$End_Date <- format(df$End_Date, "%m/%d/%Y")
转换结果
最终数据框如下:
# A tibble: 3 × 3 Start_Date End_Date Completion <chr> <chr> <chr> 1 12/12/2017 12/25/2017 100% completed 2 10/19/2022 12/19/2022 34% completed 3 10/03/2022 12/01/2022 62% completed
注:若需保留日期类型而非字符类型,跳过
format()步骤即可。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

