R-在没有周末和 - 跨度之间的开始日期和结束日期之间获得几天



现在我有一个新问题。我需要在两个日期之间计算时间表。我的问题是:必须排除周末,并且时间板可以是减或加上。例如:

Planed delivery Real delivery  
2017-11-28     2018-11-17  
2016-05-10     2016-09-22 
2016-06-08     2016-11-07   
2016-07-08     2016-06-07

等等。我有以下代码来执行此操作:

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

当我使用命令时:

getDataPart(prep_DPM_All_new$Goods_received_date, prep_DPM_All_new$Schedule_Line_Delivery)

我有以下错误:

Error in seq.Date(to = as.Date(date_received, format = fmt), from = as.Date(date_scheduled,  :'from' must be of length 1 

起初,我认为日期列的格式不是正确的,但是我认为这看起来不错。

str(prep_DPM_All_new$Goods_received_date)
 POSIXct[1:33078], format: "2016-03-24"  
str(prep_DPM_All_new$Schedule_Line_Delivery)
 POSIXct[1:33078], format: "2016-03-29"

谁能帮助我解释,为什么我会遇到错误?没有if否则语句,我遇到了错误,那是"错误的登录"。

输出应该是这样的:

Row 1: 254  
Row 2: 109   
Row 3:  98   
Row 4: -24  

我试图通过使用一些解决方案解决类似问题来解决问题,但是这些问题只有后代值。我认为负值是主要问题。

seq.Date()在这里有些棘手,有两个原因:

  1. 该函数不被矢量化,即仅允许单个有价值的参数。
  2. fromtoby参数必须对应,即,如果to低于from,则by必须为负。

这是一个解决方案,按行编号组成以克服问题1。并使用sign()range()函数克服问题2。此外,使用了chron软件包,OP从中采取了is.weekend()函数。

library(data.table)
library(chron)
# coerce to data.table and chron
DF <- setDT(DF)[, lapply(.SD, chron, format = "y-m-d")]
DF[, rn := .I][, {
  s <- sign(Actual_delivery - Planned_delivery)
  r <- range(Actual_delivery, Planned_delivery)
  .(diff.working.days = s * sum(!is.weekend(seq(r[1], r[2]))))
}, by = rn]
   rn diff.working.days
1:  1               254
2:  2                98
3:  3               109
4:  4               -24

数据

library(data.table)
DF <- fread(
  "Planned_delivery Actual_delivery  
2017-11-28     2018-11-17  
2016-05-10     2016-09-22 
2016-06-08     2016-11-07   
2016-07-08     2016-06-07"
)

最新更新