如何将R语言中不同格式的时长字符串解析为总秒数?
解决时间字符串转总秒数的问题
针对你遇到的as.duration将"m"解析为月份的问题,可以通过两种可靠方法实现正确转换:
方法一:自定义正则解析函数
直接提取字符串中的数值和时间单位,手动换算成秒:
library(stringr) # 定义转换函数 convert_to_seconds <- function(time_str) { # 匹配所有数值+单位组合(支持小数) time_parts <- str_match_all(time_str, "(\\d+\\.?\\d*)(ms|s|m)")[[1]] values <- as.numeric(time_parts[, 2]) units <- time_parts[, 3] # 按单位换算成秒后求和 total_seconds <- sum( dplyr::case_when( units == "ms" ~ values / 1000, units == "s" ~ values, units == "m" ~ values * 60, TRUE ~ 0 ) ) return(total_seconds) } # 测试示例 B <- c("39.2s", "31m 18s", "9ms") sapply(B, convert_to_seconds)
执行后输出:
39.2s 31m 18s 9ms 39.20 1878.00 0.009
方法二:使用lubridate的period函数
lubridate::period专门处理分钟、秒这类时间周期单位,不会将"m"识别为月份:
library(lubridate) library(stringr) # 先将毫秒转换为秒的小数形式(period不直接支持ms) B_adjusted <- str_replace(B, "(\\d+)ms", "\\1/1000s") # 解析为period后转成秒 sapply(B_adjusted, function(x) as.numeric(parse_period(x), "seconds"))
此方法同样能得到正确的总秒数结果。
为什么as.duration不行?
as.duration的字符串解析规则中,"m"默认对应**月份(month)**而非分钟(minute),因此会出现错误的大数值结果,改用上述方法即可规避这个问题。
内容的提问来源于stack exchange,提问作者lonestar21
相关产品推荐
相关产品推荐

