两个日期之间的差异,不包括周末

时间:2014-04-12 09:05:21

标签: r

我的日期框架中有两个日期列。我可以使用以下方法找出这些日期之间的差异:

issues <- transform(issues, duration = difftime(strptime(close_date, format="%d.%m.%Y"), 
                                                strptime(created_on, format = "%d.%m.%Y"), units="days"))

有没有办法找到问题的持续时间,不包括周末(周六和周日)?

更新

我尝试使用@agstudy解决方案:

getDuration <- function(d1, d2) {  
  myDays <- seq.Date(to = as.Date(d2, format="%d.%m.%Y"), 
                     from = as.Date(d1, format = "%d.%m.%Y"), by=1)
  result <- length(myDays[!is.weekend(myDays)])
  return(result)
}

issues <- transform(issues, duration = getDuration(created_on, close_date))

但是得到错误:

Error in seq.Date(to = as.Date(d2, format = "%d.%m.%Y"), from = as.Date(d1,  : 
  'from' must be length 1 

为什么?

2 个答案:

答案 0 :(得分:7)

另一种选择是创建日期序列,排除周末并计算其长度。

library(chron)
length(myDays[!is.weekend(myDays)])

这是一个例子:

library(chron)
myDays <- 
seq.Date(to = as.Date('01.05.2014', format="%d.%m.%Y"), 
         from=as.Date('01.01.2014', format = "%d.%m.%Y"),by=1)
length(myDays)
length(myDays[!is.weekend(myDays)])

修改

你应该对你的函数进行矢量化,以便将它与矢量一起使用。

getDuration <- function(d1, d2,fmt="%d.%m.%Y") {  
  myDays <- seq.Date(to   = as.Date(d2, format=fmt), 
                     from = as.Date(d1, format =fmt), 
                     by   = 1)
  length(myDays[!is.weekend(myDays)]
}

我在这里使用mapply

mapply(getDuration ,issues$created_on,issues$close_date)

答案 1 :(得分:3)

首先确定两个日期之间的周末天数的函数:

no_weekend_days = function(start_date, stop_date) {
    vector_with_days = strftime(seq(start, stop, by = 24 * 3600), '%A')
    return(sum(vector_with_days %in% c('Saturday', 'Sunday')))
}

使用该函数的示例:

start = as.POSIXct('2014-04-10')
stop = as.POSIXct('2014-04-21')
difftime(stop, start)
# > Time difference of 11 days
difftime(stop, start) - no_weekend_days(start, stop)
# > Time difference of 7 days