R中转换hms类型列为数值后计算统计量全返回NA
问题根源
你踩坑的核心是列类型判断错了:ride_length不是因子,是hms时长类型,这种类型底层本身就是以秒为单位存的数值,只是打印的时候会显示成HH:MM:SS的易读格式。
你用的as.numeric(as.character())是给“数值被存成因子”的场景用的,套在hms对象上会出问题:
- 对hms对象跑
as.character()会返回带冒号的时间字符串,比如"00:40:56" - 基础
as.numeric()识别不了这种带冒号的格式,解析失败就全部返回NA,这就是你看到整列全是NA的原因。
解决方法
最快方案:直接转数值
不需要走字符中转,直接对hms列调用as.numeric()就能拿到正确的秒级数值:
all_trips$ride_length <- as.numeric(all_trips$ride_length)
转完直接算均值、中位数、极值都不会有问题,数值单位是秒。如果需要其他时间单位,直接做算术转换就行:
# 转分钟 all_trips$ride_length_min <- all_trips$ride_length / 60 # 转小时 all_trips$ride_length_hour <- all_trips$ride_length / 3600
如果你已经把列误改成了HH:MM:SS格式的字符串
如果之前的错误操作已经把列存成了纯字符串,就用hms包的解析函数先转回时长对象,再提取数值:
library(hms) all_trips$ride_length <- as.numeric(as_hms(all_trips$ride_length))
校验方式
转完可以抽前几行核对,避免出错:
head( data.frame( 原始时长 = as_hms(all_trips$ride_length[1:6]), 秒数 = all_trips$ride_length[1:6] ) )
比如原始显示00:07:19的记录,对应的数值应该是7*60 +19 = 439,对应上就说明转换正确。
避坑提醒:
as.numeric(as.character())这个写法只适用于数值被错误存储为因子的场景,日期、时间、时长类的对象用这个写法基本都会解析失败。
内容的提问来源于stack exchange,提问作者bNHa
相关产品推荐
相关产品推荐

