如何让R识别无冒号分隔的数字格式时间变量?
如何在R中将无冒号的数字时间转换为时间变量
这个问题我之前也碰到过!处理这种没有分隔符的数字时间确实需要小技巧,你的思路(拆分后拼接冒号)是完全可行的,不过还有更简洁的方法,下面给你几种实用的解决方案:
首先先重现你的数据集方便测试:
Time <- data.frame("X1"=c(930,1130,914,1615))
方法1:拆分拼接法(你提到的思路)
用stringr包的str_sub拆分小时和分钟,再用冒号拼接,最后转换为时间变量,逻辑直观易懂:
library(stringr) library(lubridate) # 根据数字长度判断小时位数(3位的话小时是1位,4位是2位) Time$time_str <- ifelse(nchar(Time$X1) == 3, paste0(str_sub(Time$X1, 1, 1), ":", str_sub(Time$X1, 2, 3)), paste0(str_sub(Time$X1, 1, 2), ":", str_sub(Time$X1, 3, 4))) # 转换为lubridate的时间对象 Time$time <- hm(Time$time_str)
方法2:补零+直接解析(最简洁)
先把所有数字格式化为4位字符串(不足4位的前面补零,比如930变成0930),然后直接用时间解析函数处理,省去判断长度的步骤:
library(lubridate) # 格式化为4位字符串,前导补零 Time$X1_str <- sprintf("%04d", Time$X1) # 用lubridate快速解析 Time$time <- parse_date_time(Time$X1_str, orders = "HM") # 或者用base R的strptime,不需要额外包 Time$time_base <- strptime(Time$X1_str, format = "%H%M")
方法3:正则表达式一键替换
用正则表达式直接在数字字符串的倒数第二位前插入冒号,一行代码搞定:
library(lubridate) Time$time <- hm(sub("(\\d{1,2})(\\d{2})$", "\\1:\\2", as.character(Time$X1)))
这里正则的逻辑是:匹配前面1-2位数字(小时)和后面固定2位数字(分钟),替换成小时:分钟的格式,再交给hm函数解析。
这几种方法都能完美解决你的问题,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Data Science Beginner
相关产品推荐
相关产品推荐

