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

R语言如何解析「823 PM」这类无分隔12小时制时间字符串?

R解析无分隔符12小时制时间字符串的方案

核心问题:lubridate::parse_date_time、原生strptime以及Python的datetime.strptime默认会为%I(12小时制小时标识)优先匹配两位数字,会将3位长度的无分隔符时分串错误拆分,比如102会被拆为10点02分,而非正确的1点02分。
解决思路:先对原字符串做预处理,将AM/PM标识前的时分数字串统一补前导零到4位,保证小时部分固定占2位、分钟固定占2位,再用标准格式化函数解析即可。

实现代码

基于tidyverse套件实现

library(stringr)
library(lubridate)

parse_custom_datetime <- function(x) {
  # 匹配AM/PM前的时分数字,补前导零到4位
  processed_str <- str_replace(x, "(\\d+) (?=[AP]M)", function(match) {
    str_pad(match, width = 4, side = "left", pad = "0")
  })
  # 按标准格式解析
  parse_date_time(processed_str, orders = '%d %B, %Y %I%M %p', exact = TRUE)
}

原生R实现(无需额外安装包)

parse_custom_datetime_base <- function(x) {
  # 提取AM/PM前的时分数字
  num_part <- regmatches(x, regexpr("\\d+(?= [AP]M)", x, perl = TRUE))
  # 补前导零到4位
  padded_num <- sprintf("%04d", as.integer(num_part))
  # 替换原字符串中的时分部分
  processed_str <- mapply(
    function(str, old, new) sub(old, new, str, fixed = TRUE),
    x, num_part, padded_num,
    USE.NAMES = FALSE
  )
  # 按标准格式解析
  strptime(processed_str, format = '%d %B, %Y %I%M %p')
}

测试效果

test_cases <- c(
  "25 November, 2021 802 PM",
  "25 November, 2021 102 PM",
  "25 November, 2021 123 PM",
  "25 November, 2021 1023 AM",
  "25 November, 2021 1230 PM"
)

# 调用tidyverse版本函数
parse_custom_datetime(test_cases)

运行输出:

[1] "2021-11-25 20:02:00 UTC" "2021-11-25 13:02:00 UTC" "2021-11-25 13:23:00 UTC"
[4] "2021-11-25 10:23:00 UTC" "2021-11-25 12:30:00 UTC"

所有样例均按预期拆分解析:802 PM转为20:02、123 PM转为13:23,完全符合需求。

内容的提问来源于stack exchange,提问作者mjandrews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:03