2011-02-15 122 views
1

我试图在R中编写一个优雅的函数来计算两个时间戳之间的经过时间,这两个时间戳以格式hmm或HHMM。我想以整数分钟的形式返回已用时间。R:计算两个数字时间之间的时间间隔,例如944和1733为469分钟

这里是我的解决方案,到目前为止,这大概可以大大提高:

#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个数字更可取。

/编辑:更改代码,所花的时间

载体

回答

8

尝试以下功能正常工作:

# 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) 
} 

这避免环路所以矢量化。 mins将工作,如果小时数大于99,即HHHMM,或者您可以修改更高的时间单位。

如果5个数字时间戳其实是错误的,你可以添加以下为mins第一行:

ifelse(x<10000,x,NA) 

所以,你将在差异得到NA当一方或双方的时间戳都是5个位数。

+0

我喜欢它。感谢您的解决方案。 %%函数到底做了什么? – Zach 2011-02-15 17:38:33

相关问题