在R语言中转换混合12小时制与24小时制的时间字符串
解决混合格式时间字符串转24小时制问题
问题描述
现有一组混合格式的时间字符串:
times <- c("11:30am", "3:15pm", "2:25pm", "12:05pm", "8:25pm", "7:52pm", "13:22", "18:45", "21:14", "11:20")
需要将其统一转换为24小时制的HH:MM格式字符串,预期输出:
11:30 15:15 14:25 12:05 20:25 19:52 13:22 18:45 21:14 11:20
尝试使用以下代码时,仅得到一组数字:
times <- ifelse(grepl('am', times) | grepl('pm', times), as.POSIXct(times, format = "%I:%M%p"), as.POSIXct(times,format="%H:%M"))
问题原因
as.POSIXct返回的是POSIXct类型对象,本质是从1970-01-01 UTC开始计算的秒数(数值型)。ifelse函数会自动简化返回值的类型,将POSIXct对象强制转换为数值,因此最终得到的是时间戳数字而非格式化的时间字符串。
解决方法
方法1:Base R原生实现
先将时间字符串解析为时间对象,再格式化为目标字符串:
times <- c("11:30am", "3:15pm", "2:25pm", "12:05pm", "8:25pm", "7:52pm", "13:22", "18:45", "21:14", "11:20") # 解析为POSIXlt时间对象(避免ifelse强制转数值) parsed_times <- lapply(times, function(t) { if (grepl('am|pm', t)) { strptime(t, format = "%I:%M%p") } else { strptime(t, format = "%H:%M") } }) # 格式化为HH:MM字符串 formatted_times <- sapply(parsed_times, function(x) strftime(x, "%H:%M")) # 输出结果 print(formatted_times)
方法2:lubridate包简化实现
使用lubridate的parse_date_time函数自动识别多种时间格式,再格式化:
library(lubridate) times <- c("11:30am", "3:15pm", "2:25pm", "12:05pm", "8:25pm", "7:52pm", "13:22", "18:45", "21:14", "11:20") # 自动解析两种格式的时间 parsed_times <- parse_date_time(times, orders = c("%I:%M%p", "%H:%M")) # 格式化为HH:MM字符串 formatted_times <- strftime(parsed_times, "%H:%M") # 输出结果 print(formatted_times)
两种方法最终都会得到符合预期的24小时制时间字符串。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

