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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:45:39