我试图使用包bizdays计算两个日期之间的工作日数。有许多帖子说,使用它来计算两个日期之间的营业天数是一个很好的选择,但是在使用它时没有关于具体问题的帖子。我目前对输出有一个问题。
我有不同日期的数据,从秒到月不等,但是在下面的示例df中,我将只显示不到一天的差异(这些是问题出现的地方)。
这是我的df:
Transition_Dates <- data.frame(Enter = as.POSIXct(c("2015-06-28 19:48:00",
"2015-06-14 04:05:00",
"2013-11-21 04:56:59",
"2016-01-16 11:18:00",
"2015-12-19 14:02:59")),
Exit = as.POSIXct(c("2015-06-28 19:48:59",
"2015-06-14 04:06:59",
"2013-11-21 10:24:00",
"2016-01-18 06:21:00",
"2015-12-19 14:11:00")),
Time_in_State = c(0.00, 0.00, 0.23, 1.79, 0.01))正如您所看到的,有第三列有一个计算而不删除非工作日(很好地比较下面的bizdays输出)。
这是我的bizdays日历:
library(bizdays)
library(lubridate)
Non_Working_Calendar <- Calendar(holidays = as.Date(c("2013-07-04", "2013-09-02", "2013-10-14", "2013-11-11", "2013-11-21", "2013-11-22", as.character(seq(ymd("2013-12-24"), ymd("2014-01-01"), "days")),
"2014-01-20", "2014-02-17", "2014-05-26", "2014-07-04", "2014-09-01", "2014-10-13", "2014-11-11", "2014-11-27", "2014-11-28", as.character(seq(ymd("2014-12-24"), ymd("2015-01-01"), "days")),
"2015-01-19", "2015-02-16", "2015-05-25", "2015-07-03", "2015-09-07", "2015-10-12", "2015-11-11", "2015-11-26", "2015-11-27", as.character(seq(ymd("2015-12-24"), ymd("2016-01-01"), "days")),
"2016-01-18", "2016-02-15", "2016-05-30", "2016-07-04", "2016-09-05", "2016-10-10", "2016-11-11", "2016-11-24", "2016-11-25", as.character(seq(ymd("2016-12-24"), ymd("2017-01-01"), "days")),
"2017-01-16", "2017-02-20", "2017-05-29", "2017-07-04", "2017-09-04", "2017-10-09", "2017-11-10", "2017-11-23", "2017-11-24", as.character(seq(ymd("2016-12-24"), ymd("2017-01-01"), "days")))), start.date = as.Date("2010-01-01"), end.date = as.Date("2020-01-01"), weekdays = c("saturday", "sunday"))
bizdays.options$set(default.calendar = Non_Working_Calendar)将bizdays输出添加到df:
Transition_Dates$bdays <- bizdays(Transition_Dates$Enter, Transition_Dates$Exit)
Transition_Dates
Enter Exit Time_in_State bdays
1 2015-06-28 19:48:00 2015-06-28 19:48:59 0.00 -1
2 2015-06-14 04:05:00 2015-06-14 04:06:59 0.00 -1
3 2013-11-21 04:56:59 2013-11-21 10:24:00 0.23 -1
4 2016-01-16 11:18:00 2016-01-18 06:21:00 1.79 -1
5 2015-12-19 14:02:59 2015-12-19 14:11:00 0.01 -1有没有人遇到过类似的问题,或者我完全错过了什么?对于大多数观察结果,bdays列正确地从Time_in_State列向上或向下舍入,但我还没有弄清楚为什么它会给我-1作为其中的一些。另外,有没有一种方法可以让bizdays输出带有小数(例如,5.5,12.11)?我在手册里什么都没看到。先谢谢你。
发布于 2016-04-12 22:23:40
我是bizdays的父亲。这是一个BUG,我将处理它,为了得到您想要的,我建议下面的代码。
Transition_Dates <- data.frame(Enter = as.POSIXct(c("2015-06-28 19:48:00",
"2015-06-14 04:05:00",
"2013-11-21 04:56:59",
"2016-01-16 11:18:00",
"2015-12-19 14:02:59")),
Exit = as.POSIXct(c("2015-06-28 19:48:59",
"2015-06-14 04:06:59",
"2013-11-21 10:24:00",
"2016-01-18 06:21:00",
"2015-12-19 14:11:00")),
Time_in_State = c(0.00, 0.00, 0.23, 1.79, 0.01))
bypass <- function(x, cal) x
library(bizdays)
library(lubridate)
Non_Working_Calendar <- Calendar(holidays=as.Date(c("2013-07-04", "2013-09-02", "2013-10-14", "2013-11-11", "2013-11-21", "2013-11-22", as.character(seq(ymd("2013-12-24"), ymd("2014-01-01"), "days")),
"2014-01-20", "2014-02-17", "2014-05-26", "2014-07-04", "2014-09-01", "2014-10-13", "2014-11-11", "2014-11-27", "2014-11-28", as.character(seq(ymd("2014-12-24"), ymd("2015-01-01"), "days")),
"2015-01-19", "2015-02-16", "2015-05-25", "2015-07-03", "2015-09-07", "2015-10-12", "2015-11-11", "2015-11-26", "2015-11-27", as.character(seq(ymd("2015-12-24"), ymd("2016-01-01"), "days")),
"2016-01-18", "2016-02-15", "2016-05-30", "2016-07-04", "2016-09-05", "2016-10-10", "2016-11-11", "2016-11-24", "2016-11-25", as.character(seq(ymd("2016-12-24"), ymd("2017-01-01"), "days")),
"2017-01-16", "2017-02-20", "2017-05-29", "2017-07-04", "2017-09-04", "2017-10-09", "2017-11-10", "2017-11-23", "2017-11-24", as.character(seq(ymd("2016-12-24"), ymd("2017-01-01"), "days")))),
start.date=as.Date("2010-01-01"),
end.date = as.Date("2020-01-01"),
weekdays = c("saturday", "sunday"),
adjust.from=bypass,
adjust.to=bypass)
bizdays.options$set(default.calendar = Non_Working_Calendar)有了这段代码
> bizdays(Transition_Dates$Enter, Transition_Dates$Exit)
[1] 0 0 0 0 0出现此问题是因为bizdays默认设置(adjust.from和adjust.to)打算复制Excel的NETWORKDAYS行为。一旦from和to参数是非工作日,日期调整会导致您指出的奇怪结果。
> is.bizday(Transition_Dates$Enter)
[1] FALSE FALSE FALSE FALSE FALSE
> is.bizday(Transition_Dates$Exit)
[1] FALSE FALSE FALSE FALSE FALSE函数bypass禁用了调整,现在我必须找到一种干净的方法将该特性合并到bizdays中。
https://stackoverflow.com/questions/36489237
复制相似问题