如何标准化R数据框中PROG_START列的多种时间格式
解决R数据框中混合日期格式的标准化问题
问题分析
你的数据框PROG_START列包含两种日期格式:
- 文本格式:
星期, 月, 日, 年(如Tuesday, October 1, 2019) - 10位UTC时间戳(如
1682294400,对应2023-04-24)
之前的代码失败原因:
- 正则表达式错误:使用
\\d{10}\\.\\d{3}匹配带毫秒的时间戳,但你的数据是10位整数时间戳,导致匹配失败 - 日期解析函数选择错误:用
dmy()处理文本日期,但文本格式是月在前,应该用mdy();时间戳分支未触发时,错误地用dmy()处理数字字符串,导致全NA
正确解决方案
使用dplyr和lubridate包,先区分日期类型,再分别解析,最后统一格式化:
# 加载必要包 library(dplyr) library(lubridate) # 原始数据 data <- data.frame(PROG_START = c("Tuesday, October 1, 2019", "1682294400")) # 清洗并标准化日期 data_clean <- data %>% mutate( # 识别10位整数时间戳 is_timestamp = str_detect(PROG_START, "^\\d{10}$"), # 分别解析两种格式的日期 parsed_date = case_when( is_timestamp ~ as.POSIXct(as.numeric(PROG_START), origin = "1970-01-01", tz = "UTC"), TRUE ~ mdy(PROG_START) # mdy自动忽略星期,识别"月, 日, 年"格式 ), # 格式化为"日-月-年" PROG_START = format(parsed_date, "%d-%m-%Y") ) %>% # 移除中间辅助列 select(-is_timestamp, -parsed_date) # 查看结果 print(data_clean)
输出结果
PROG_START 1 01-10-2019 2 24-04-2023
关键细节说明
str_detect(PROG_START, "^\\d{10}$"):精准匹配10位纯数字的时间戳,避免误匹配其他含数字的文本mdy(PROG_START):lubridate的mdy()函数可以自动忽略文本中的星期部分,正确解析"Tuesday, October 1, 2019"为日期as.POSIXct(as.numeric(PROG_START), origin = "1970-01-01", tz = "UTC"):将10位时间戳转换为UTC标准时间,确保年份正确(1682294400对应2023年而非1682年)
内容的提问来源于stack exchange,提问作者JonathonV92
相关产品推荐
相关产品推荐

