R语言:如何计算两个dttm类型时间差并求平均值?
解决dttm类型时间差计算与格式化问题
报错原因解析
你碰到的as.POSIXct.default错误,核心问题是difftime()返回的是difftime类对象,直接用mean()处理时R无法自动完成类型转换,再加上分组场景下的类型兼容限制,就触发了报错。
可行解决方案
方法1:利用lubridate原生时间差类型计算
lubridate的dttm类型直接相减会生成duration对象,支持直接求均值,最后转成时分秒格式:
library(lubridate) library(dplyr) cyclistic_data %>% drop_na() %>% group_by(member_casual) %>% summarise( av_ride_duration = mean(ended_at - started_at), av_ride_time = as_hms(av_ride_duration) # 转为HH:MM:SS格式 )
方法2:转成数值秒数计算后再格式化
先把时间差转为数值型秒数,求均值后用hms()函数转成时分秒,兼容性更强:
library(dplyr) library(hms) cyclistic_data %>% drop_na() %>% group_by(member_casual) %>% summarise( av_ride_secs = mean(as.numeric(difftime(ended_at, started_at, units = "secs"))), av_ride_time = hms(av_ride_secs) )
方法3:优化你自己的补充方案
注意原代码中started_at - ended_at会得到负时间差,调整顺序后更合理:
library(lubridate) library(dplyr) cyclistic_data %>% drop_na() %>% group_by(member_casual) %>% reframe( av_member_ride_time = as_hms(mean(difftime(ended_at, started_at, units = "secs"))) )
额外注意事项
- 如果你的
started_at/ended_at列实际是字符类型,先强制转为dttm:mutate(across(c(started_at, ended_at), ymd_hms)) as_hms()(lubridate内置)和hms::hms()功能一致,任选其一即可。
内容的提问来源于stack exchange,提问作者Jabe Milam
相关产品推荐
相关产品推荐

