R中字符串转hms(含超24小时)及转换报错解决方法
问题解决:字符串转hms类型报错及超24小时处理方法
一、报错原因分析
你遇到的abort_lossy_cast()错误,核心原因是部分ride_length字段的小时数超过24,直接用as_hms()转换时,函数默认会把超过24的小时数取模24(比如25:00:00变成1:00:00),导致时长信息丢失,触发了防丢失转换的报错机制。另外也可能存在少量格式错误的字符串(比如缺少冒号、包含非数字字符)。
二、解决方案
1. 保留完整时长(支持超24小时)
如果需要保留超过24小时的完整时长,先用lubridate包解析为周期对象,再转换为hms类型:
library(tidyverse) library(tidymodels) library(hms) library(lubridate) dataset2 <- read.csv("Bike_Trips_2019.csv") # 其他预处理步骤 dataset2$user_type <- factor(dataset2$user_type, levels = c("Customer", "Subscriber"), labels = c("no","yes")) dataset2$trip_id <- as.character(dataset2$trip_id) dataset2$start_time <- as.POSIXct(dataset2$start_time) dataset2$end_time <- as.POSIXct(dataset2$end_time) dataset2$tripduration <- parse_number(dataset2$tripduration) # 处理ride_length转换 dataset2$ride_length <- as_hms(period_to_seconds(hms(dataset2$ride_length))) # 后续划分数据集步骤 set.seed(421) split <- initial_split(dataset2, prop = 0.8, strata = user_type) train <- split %>% training() test <- split %>% testing()
这个方法会将"25:30:00"这类字符串正确转换为hms对象,完整保留25小时30分钟的时长信息。
2. 仅保留一天内的时分秒(超24小时取模)
如果不需要保留超过24小时的部分,允许信息丢失,可以强制转换:
dataset2$ride_length <- as_hms(dataset2$ride_length, allow_lossy_cast = TRUE)
此方法会将超过24的小时数取模24,比如25:00:00转为1:00:00,不会触发报错。
3. 排查格式错误数据
先检查是否存在格式不符合HH:MM:SS的ride_length值,比如缺少冒号、包含非数字字符:
# 筛选格式错误的行 invalid_rows <- dataset2[!str_detect(dataset2$ride_length, "^\\d+:\\d{2}:\\d{2}$"), ] print(invalid_rows)
如果有格式错误的数据,需要先清洗(比如替换异常字符、补全时分秒格式)再进行转换。
三、建模补充建议
对于你的逻辑回归任务,若ride_length作为特征使用,建议直接将其转换为总秒数(period_to_seconds(hms(dataset2$ride_length)))更适合建模,因为时分秒格式的hms对象在模型中本质也是按数值处理,直接用秒数会更直观。
内容的提问来源于stack exchange,提问作者datadata
相关产品推荐
相关产品推荐

