R语言修复字段内不一致时间值 统一转换为hh:mm时间格式
R中混合格式OriginTime字段统一转hh:mm时间的方法
问题场景
数据框的OriginTime字段由多份Excel数据rbind合并得到,整列当前为字符类型,值混合两种格式:
- Excel导出的十进制时间(代表时间在全天24小时中的占比,比如0.25对应6:00)
- 已经是
hh:mm格式的字符串
示例数据如下:
OriginTime <- c(0.777888, 0.999888, 0.25, 0.3755, "12:24", "05:59")
直接调用chron::times()转换整列时,原本为hh:mm格式的行会被识别为无效值返回NA,仅十进制数值能正常转换。之前尝试的分支判断代码未生效:
ifelse(substr(OriginTime,3,3)!=":",chron::times(as.numeric(as.character(OriginTime))),OriginTime)
问题原因
ifelse会强制统一所有返回值的存储类型,chron生成的时间类对象会被强转为基础数值,导致转换结果异常chron::times()默认识别的字符串时间格式为h:m:s,直接传入hh:mm格式的字符串会因为缺少秒位被判定为无效值返回NA- 用第三位字符是否为冒号判断格式不准确,比如
9:05这类个位数小时的字符串,第三位是0不是冒号,会被误判为十进制值
可直接运行的解决代码
library(chron) # 1. 准确识别格式:只要字符串含冒号,就属于已有的hh:mm格式 is_hhmm_format <- grepl(":", OriginTime) # 2. 初始化统一的时间存储向量 converted_time <- as.times(rep(NA, length(OriginTime))) # 3. 分支处理两种格式 # 处理十进制时间:直接转数值传入times即可,chron默认按天占比解析 converted_time[!is_hhmm_format] <- times(as.numeric(OriginTime[!is_hhmm_format])) # 处理hh:mm字符串:补全秒位为:00,符合chron的解析规则 converted_time[is_hhmm_format] <- times(paste0(OriginTime[is_hhmm_format], ":00")) # 4. 统一格式化输出为hh:mm格式,不需要秒位 final_result <- format(converted_time, format = "hours:minutes")
运行后输出结果:
> final_result [1] "18:40" "23:59" "06:00" "09:00" "12:24" "05:59"
提示:如果后续需要做时间计算,直接使用converted_time这个times类型的向量即可,final_result是格式化后的字符型向量,仅适合展示用。
内容的提问来源于stack exchange,提问作者r_user
相关产品推荐
相关产品推荐

