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

如何在R语言中将HMS格式的字符型时长向量转换为分钟?

嘿,这个问题我之前也帮人解决过——用strsplit处理确实会因为部分字符串缺少H/M/S导致元素长度不一致,很头疼对吧?给你两种靠谱的解决方法,一种用专门的时间处理包,另一种用基础R的正则,都能完美解决你的需求:

方法1:使用lubridate包(推荐)

lubridate是R中处理时间、时长类数据的利器,它能自动识别HMS格式的字符串,不用你手动拆分:

# 如果没安装过lubridate,先安装
install.packages("lubridate")
library(lubridate)

# 你的原始数据
duration <- c("57M8S","31S","2H20M31S", "21M32S")

# 将字符向量转换为hms时长对象
hms_duration <- hms(duration)

# 转换为分钟(hms对象默认以秒为单位存储,除以60即可),并保留两位小数
result <- round(as.numeric(hms_duration) / 60, 2)

# 查看结果
result
#> [1]  57.13   0.52 140.52  21.53

这个方法的优势在于完全不用关心字符串里有没有H、M或者S,包会自动处理所有缺失情况,代码简洁又不容易出错。

方法2:基础R正则实现(无需额外包)

如果你不想引入第三方包,可以用正则表达式分别提取小时、分钟、秒的数值,再计算总分钟:

# 定义转换函数
hms_to_minutes <- function(x) {
  # 提取小时(没有则返回0)
  hours <- as.numeric(gsub(".*?(\\d+)H.*", "\\1", x))
  hours[is.na(hours)] <- 0
  
  # 提取分钟(没有则返回0)
  minutes <- as.numeric(gsub(".*?(\\d+)M.*", "\\1", x))
  minutes[is.na(minutes)] <- 0
  
  # 提取秒(没有则返回0)
  seconds <- as.numeric(gsub(".*?(\\d+)S.*", "\\1", x))
  seconds[is.na(seconds)] <- 0
  
  # 计算总分钟并保留两位小数
  round(hours * 60 + minutes + seconds / 60, 2)
}

# 应用函数到你的向量
result <- hms_to_minutes(duration)

# 查看结果
result
#> [1]  57.13   0.52 140.52  21.53

这里的正则表达式会匹配每个时间单位前的数字,对于没有对应单位的字符串,gsub会返回原字符串,转成数值后是NA,我们再把这些NA替换成0,就能统一计算了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:15