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
相关产品推荐
相关产品推荐

