You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:42:04