Bizdays函数返回不正确的值

时间:2016-04-07 23:54:59

标签: r date datetime

我正在尝试使用包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)?我在手册中没有看到任何内容。非常感谢你提前。

1 个答案:

答案 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行为。一旦fromto参数为非工作日,日期调整会导致您指出的奇怪结果。

> is.bizday(Transition_Dates$Enter)
[1] FALSE FALSE FALSE FALSE FALSE
> is.bizday(Transition_Dates$Exit)
[1] FALSE FALSE FALSE FALSE FALSE

函数bypass禁用调整,现在我必须想出一种在bizdays中合并该功能的简洁方法。

相关问题