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

使用lubridate转换含hms与ms格式的列时出现NA问题求助

这个问题我之前也踩过坑!lubridate的hms()函数默认只认时:分:秒的三段式格式,所以像"36:10"这种只有分:秒的两段式内容,就会直接被判定为无效格式转成NA。其实咱们只要先把所有时间字符串统一成三段式,再用hms()转换就没问题了,具体操作如下:

解决方法

步骤1:统一时间字符串格式

先判断每个字符串里冒号的数量:只有1个冒号的是分:秒格式,给它前面补上"0:"变成"0:分:秒";有2个冒号的时:分:秒格式保持原样,NA值也直接保留。

这里可以借助stringr包的str_count()函数来统计冒号数量,代码示例:

library(lubridate)
library(stringr)

# 你的原始数据
a <- c("36:10", "1:06:32", NA)

# 统一格式:给两段式的时间前面加"0:"
a_unified <- ifelse(str_count(a, ":") == 1, paste0("0:", a), a)

步骤2:转换为hms时间格式

把统一后的字符串传给hms(),就能正确识别所有有效时间了:

b <- hms(a_unified)
b

运行后你会得到正确的结果:

[1] "36M 10S"  "1H 6M 32S" NA

备选方案(不依赖stringr)

如果不想额外加载stringr包,用基础R的strsplit()也能实现格式统一:

a_unified <- sapply(a, function(x) {
  if (is.na(x)) return(x)
  # 按冒号分割字符串,看有几个部分
  parts <- strsplit(x, ":")[[1]]
  if (length(parts) == 2) paste0("0:", x) else x
})

# 转换为hms格式
b <- hms(a_unified)

这样处理后,两种格式的时间都能被正确解析,NA值也会原封不动保留下来~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:49:10