datetime - R:计算2个数字时间之间耗时,例如944和1733是469分钟

我正在尝试在 R 中编写一个优雅的函数来计算两个时间戳之间耗时,这两个时间戳存储为整数,格式为 hmm 或 hhmm。我想以分钟的整数形式返回耗时。

到目前为止,这是我的解决方案,可能会得到很大改进:

#Treatment of varous length inputs:
#1 digit  = m
#2 digits = mm
#3 digits = hmm
#4 digits = hhmm
#5+ digits = failure

elapsedtime <- function(S,E) {
    S<-c(as.character(S))
    E<-c(as.character(E))

    if (length(S)!=length(E)) {
        stop("Invalid input")
    }

    for (i in seq(1:length(S))) {
        if (nchar(S[i])>4) {S[i]<-NA}
        if (nchar(E[i])>4) {E[i]<-NA}

        while (nchar(S[i])<4) {
            S[i]<-paste('0',S[i],sep='')
        }

        while (nchar(E[i])<4) {
            E[i]<-paste('0',E[i],sep='')
        }
        S[i]<-as.character(as.numeric(substr(S[i],1,2))*60+as.numeric(substr(S[i],3,4)))
        E[i]<-as.character(as.numeric(substr(E[i],1,2))*60+as.numeric(substr(E[i],3,4)))

    }
    S<-as.numeric(S)
    E<-as.numeric(E)

    return(E-S)
}
elapsedtime(944,1733) 
elapsedtime(44,33)
elapsedtime(44,133)
elapsedtime(c(944,44),c(1733,33))
elapsedtime(c(44,44),c(33,133))
elapsedtime(944,17335)
elapsedtime(c(944,945),c(1733,17335))
elapsedtime(c(944,945),c(1733,17335,34))

我不太需要处理 1 位和 2 位数字的情况,但我需要能够处理 3 位或 4 位数字的输入。我在很多日期运行此程序,快速完成 3/4 位数比缓慢完成 1、2、3 或 4 位数要好得多。

/edit:更改代码以在时间向量上正常工作

最佳答案

尝试以下功能:

 # calculate number of minutes of timestamp
 mins <- function(x){
   floor(x/100)*60+x%%100
 }

 # calculate difference in minutes
 elapsedtime <- function(S,E){
   mins(E)-mins(S)
 }

这避免了循环,因此被矢量化了。如果小时数大于 99,即 HHHMM,mins 将起作用,或者您可以修改为更高的时间单位。

如果5位时间戳确实有误,可以在mins的第一行添加:

ifelse(x<10000,x,NA)

因此,当其中一个或两个时间戳均为 5 位数时,您将得到一个 NA 差值。

https://stackoverflow.com/questions/5007026/

相关文章:

php - 使用 preg_replace 删除特定字符周围的空格

.net - 重性高潮不起作用

sql-server - SQL Server 数据库还原卡在 99%

ms-access - 通过 Access VBA 代码保存查询

php - 在 Web 服务器环境中的 PHP 中启用进程控制 (PCNTL) 有哪些副作用?

wordpress - 如何检索当前获取附件的 MIME 类型

sql - 在 SQL 中将列的子集重置为其默认值?

sql-server - T-SQL 固定宽度输出

windows - Perl 中的“打开”语句拆分包含空格的路径 - 如何读取路径中包含空格的文件?

vb6 - 如何枚举计算机上可用的 COM 端口?