工作日计算的持续时间和R中的时间重叠

时间:2018-07-23 00:42:57

标签: date overlap duration days bizdays

我有一张员工缺勤日期的表格。我需要计算每位员工的缺勤天数(以工作日为单位)。我为每个员工有多个记录。其中一些记录是重复的,嵌入的或与其他日期重叠或完全独立的日期。我正在尝试编写一个函数来计算重叠和重复的天数(营业日)。我的数据看起来像这样

 ID<- as.factor(c(rep(1,3), rep(2,3), rep(3,3)))
Startdate= as.Date(c("1-1-2013", "1-4-2013", "2-2-2013", "3-3-2018", "3-2-2018", "4-5-2018",
         "7-5-2016","7-9-2016","7-15-2016"), format = "%m-%d-%Y" )
Enddate = c("1-17-2013", "1-19-2013", "2-13-2013", "3-9-2018", "3-13-2018", "4-18-2018","7-22-2016", " 7-21-2016", "8-3-2016")
df<- data.frame(ID, Startdate, Enddate)
   df$Startdate= as.Date(df$Startdate, format = "%m-%d-%Y")
df$Enddate= as.Date(df$Enddate, format = "%m-%d-%Y")
df

ID开始日期结束日期 1 1-1-2013 1-17-2013
1 1-4-2013 1-19-2013
1 2-2-2013 2-13-2013
2 3-3-2018 3-9-2018
2 3-2-2018 3-13-2018
2 4-5-2018 4-18-2018
3 2016年5月7日2016年7月22日
3 7-9-2016 7-21-2016
3 2016年7月15日2016年8月3日

我可以使用此代码计算重叠和持续时间

    df$duration <- difftime(df$Enddate, df$Startdate , units= "days" )+1

# calculate overlap
df$overlap <- 0

for(i in 2:nrow(df)){
  samepat <- df$ID[i]==df$ID[i-1]
    curovl <- min(df$Enddate[i],df$Enddate[i-1]) - df$Startdate[i]+1
    if(curovl>0 & samepat) df$overlap[i] <- curovl
}

# aggregate duration and overlap
res <- aggregate(duration ~ ID, data=df, sum)
res$overlap <- aggregate(overlap ~ ID, data=df, sum)[,2]

# calculate corrected value
res$corrected <- res$duration - res$overlap

但是我只需要计算工作日而不是总天数。我正在尝试使用bizdays包

中的bizdays函数
library(bizdays)
cal <-  create.calendar(name = "mycal", weekdays=c("saturday", "sunday"))
df$duration <- bizdays(df$Startdate, df$Enddate, cal = "mycal")+1

有什么想法吗?

0 个答案:

没有答案