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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:07:14