我正在尝试使用包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)?我在手册中没有看到任何内容。非常感谢你提前。
答案 0 :(得分:1)
我是个傻瓜的父亲。 这是一个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
中合并该功能的简洁方法。