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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:27:45