使用R的hms包将csv中HH:MM:SS字符串转换为同格式时间向量
报错核心原因
as_hms()的隐式转换规则非常严格,哪怕你肉眼看字段是hh:mm:ss格式,只要存在以下任意一种情况就会触发损耗转换报错:
- 字符串前后存在空格、制表符等不可见特殊字符
- 时分秒部分有非数字/冒号的多余字符
- 小时数值≥24(比如表示时长的
25:30:00,as_hms()默认将输入识别为一日内的时间,不接受≥24的小时值) - 存在空字符串、NA值
第一步:定位错误行的实际问题
先输出报错提示的前几行错误值,确认具体问题:
# 输出报错位置的原始值,附带前后引号方便看是否有隐藏空格 cat(paste0("'", file$time[c(140364:140368)], "'"), sep = "\n")
对应解决方法
情况1:存在多余空格/特殊字符
先清洗字符串再转换:
library(hms) library(stringr) # 仅保留数字和冒号,去除所有其他字符 clean_time <- str_remove_all(file$time, "[^0-9:]") time <- as_hms(clean_time)
情况2:包含≥24小时的时长数据
如果你的时间字段是时长而非一日内的时间,改用parse_hms()转换,原生支持超过24小时的时长:
time <- parse_hms(file$time)
也可以配合lubridate包提升兼容性:
library(lubridate) time <- as_hms(hms(file$time))
情况3:少量无效值需要跳过转换
如果允许无效值转为NA,添加静默转换参数即可:
time <- as_hms(file$time, quiet = TRUE) # 转换完成后可通过以下代码定位所有转换失败的行手动处理 failed_rows <- which(is.na(time))
内容的提问来源于stack exchange,提问作者JKO
相关产品推荐
相关产品推荐

