在R语言中将dmy_hm/dmy_hms格式日期统一转换为mdy_hm格式
日期格式统一转换问题
需要将数据列中同时存在dmy_hm(示例:01/05/2023 14:30)和dmy_hms(示例:01/05/2023 14:30:45)两种格式的日期字符串,转换为统一的mdy_hm格式日期对象。此前尝试多种方法均出现NA值,部分方法仅能解析一半数据。
已尝试的代码
- 方法1:
format_ymd <- as.Date(dat$timestamp, format = "%Y-%m-%d") format_dmy <- as.Date(dat$timestamp, format = "%d/%m/%Y") as.Date(ifelse(is.na(format_ymd), format_dmy, format_ymd), origin = "1970-01-01")
- 方法2:
parse_date_time(date_time, orders = c("dmY_HM", "dmY_HMS"))
(该方法仅解析出一半数据,其余为NA)
- 方法3:
addFormats(c('%d-%m-%Y', '%d/%m/%Y')) dat$timestamp <- lapply(dat$timestamp, function(x) format(anydate(x), "%d-%m-%Y"))
解决方案
推荐使用lubridate包的工具,精准覆盖两种格式后转换为目标格式:
方法一:用parse_date_time统一解析
library(lubridate) # 解析两种格式的日期字符串,orders参数指定正确格式规则 dat$parsed_timestamp <- parse_date_time(dat$timestamp, orders = c("dmy HM", "dmy HMS")) # 转换为mdy_hm格式的日期时间对象 dat$mdy_hm_timestamp <- as.POSIXct(format(dat$parsed_timestamp, "%m/%d/%Y %H:%M"), format = "%m/%d/%Y %H:%M")
方法二:分两次解析补全NA
library(lubridate) # 先尝试解析带秒的格式 dat$parsed_timestamp <- dmy_hms(dat$timestamp, quiet = TRUE) # 对解析失败的行,用不带秒的格式补解析 na_rows <- is.na(dat$parsed_timestamp) dat$parsed_timestamp[na_rows] <- dmy_hm(dat$timestamp[na_rows]) # 转换为mdy_hm格式 dat$mdy_hm_timestamp <- format(dat$parsed_timestamp, "%m/%d/%Y %H:%M") # 若需保留日期时间对象类型而非字符串,执行下方转换 dat$mdy_hm_timestamp <- as.POSIXct(dat$mdy_hm_timestamp, format = "%m/%d/%Y %H:%M")
说明
- 之前使用
parse_date_time失败,大概率是orders参数格式写法错误,需用"dmy HM"(日期部分dmy,时间部分HM,空格分隔)而非"dmY_HM"; dmy_hms和dmy_hm组合解析的方式,能分别匹配带秒和不带秒的格式,补全NA值;- 最终转换为
mdy_hm格式时,若只需字符串格式可直接用format,若需日期时间对象则用as.POSIXct二次转换。
内容的提问来源于stack exchange,提问作者Jalcorn
相关产品推荐
相关产品推荐

