我正在尝试在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))
Run Code Online (Sandbox Code Playgroud)
我不太喜欢处理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)
}
Run Code Online (Sandbox Code Playgroud)
这避免了循环,因此是矢量化的.mins如果小时大于99,即HHHMM,则可以工作,或者您可以修改更高时间的单位.
如果5位数的时间戳实际上是错误的,您可以添加以下内容作为第一行mins:
ifelse(x<10000,x,NA)
Run Code Online (Sandbox Code Playgroud)
因此NA,当其中一个或两个时间戳都是5位数时,您将获得差异.
| 归档时间: |
|
| 查看次数: |
1224 次 |
| 最近记录: |