如何基于R语言DataFrame的起止时间计算分钟级耗时数值列?
计算时间差并转换为分钟数的正确方法
场景说明
现有如下结构的DataFrame,需要新增一列TimeTaken,存储end_time与start_time差值的分钟数:
start_time <- c("09:00:00.000", "09:23:00.000", "09:23:00.000", "15:37:00.000") end_time <- c("09:50:00.000", "09:50:00.000","09:50:00.000","16:10:00.000") CO.TimeTaken <- data.frame(start_time, end_time)
原始输出:
> CO.TimeTaken start_time end_time 1 09:00:00.000 09:50:00.000 2 09:23:00.000 09:50:00.000 3 09:23:00.000 09:50:00.000 4 15:37:00.000 16:10:00.000
现有尝试的问题
使用lubridate的hms函数转换时间后直接相减,得到的是Period类型结果,会出现1H -27M 0S这类拆分显示的格式,无法直接得到统一的分钟数值:
library(lubridate) CO.TimeTaken$start_time <- hms(as.character(CO.TimeTaken$start_time)) CO.TimeTaken$end_time <- hms(as.character(CO.TimeTaken$end_time)) CO.TimeTaken$TimeTaken <- CO.TimeTaken$end_time - CO.TimeTaken$start_time
错误输出:
> CO.TimeTaken start_time end_time TimeTaken 1 9H 0M 0S 9H 50M 0S 50M 0S 2 9H 23M 0S 9H 50M 0S 27M 0S 3 9H 23M 0S 9H 50M 0S 27M 0S 4 15H 37M 0S 16H 10M 0S 1H -27M 0S
解决方案
方法1:借助lubridate的Duration类型转换
将时间差转换为Duration类型,再除以1分钟的Duration值,得到纯数值的分钟数:
library(lubridate) CO.TimeTaken$start_time <- hms(as.character(CO.TimeTaken$start_time)) CO.TimeTaken$end_time <- hms(as.character(CO.TimeTaken$end_time)) CO.TimeTaken$TimeTaken <- as.duration(CO.TimeTaken$end_time - CO.TimeTaken$start_time) / dminutes(1)
正确输出:
> CO.TimeTaken start_time end_time TimeTaken 1 9H 0M 0S 9H 50M 0S 50 2 9H 23M 0S 9H 50M 0S 27 3 9H 23M 0S 9H 50M 0S 27 4 15H 37M 0S 16H 10M 0S 33
方法2:直接转换为秒数计算
把hms对象转为总秒数,差值除以60得到分钟数:
library(lubridate) CO.TimeTaken$start_time <- hms(as.character(CO.TimeTaken$start_time)) CO.TimeTaken$end_time <- hms(as.character(CO.TimeTaken$end_time)) CO.TimeTaken$TimeTaken <- (as.numeric(CO.TimeTaken$end_time) - as.numeric(CO.TimeTaken$start_time)) / 60
此方法同样能得到数值型的正确结果。
方法3:Base R原生实现(无需lubridate)
用strptime转换时间格式,再用difftime直接指定单位为分钟:
CO.TimeTaken$start_time <- strptime(CO.TimeTaken$start_time, format = "%H:%M:%OS") CO.TimeTaken$end_time <- strptime(CO.TimeTaken$end_time, format = "%H:%M:%OS") CO.TimeTaken$TimeTaken <- difftime(CO.TimeTaken$end_time, CO.TimeTaken$start_time, units = "mins") # 可选:转为纯数值(默认是difftime类型) CO.TimeTaken$TimeTaken <- as.numeric(CO.TimeTaken$TimeTaken)
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

