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

