首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数返回不正确的值

函数返回不正确的值
EN

Stack Overflow用户
提问于 2016-04-07 23:54:59
回答 1查看 774关注 0票数 0

我试图使用包bizdays计算两个日期之间的工作日数。有许多帖子说,使用它来计算两个日期之间的营业天数是一个很好的选择,但是在使用它时没有关于具体问题的帖子。我目前对输出有一个问题。

我有不同日期的数据,从秒到月不等,但是在下面的示例df中,我将只显示不到一天的差异(这些是问题出现的地方)。

这是我的df:

代码语言:javascript
复制
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日历:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)?我在手册里什么都没看到。先谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 22:23:40

我是bizdays的父亲。这是一个BUG,我将处理它,为了得到您想要的,我建议下面的代码。

代码语言:javascript
复制
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)

有了这段代码

代码语言:javascript
复制
> bizdays(Transition_Dates$Enter, Transition_Dates$Exit)
[1] 0 0 0 0 0

出现此问题是因为bizdays默认设置(adjust.from和adjust.to)打算复制Excel的NETWORKDAYS行为。一旦fromto参数是非工作日,日期调整会导致您指出的奇怪结果。

代码语言:javascript
复制
> is.bizday(Transition_Dates$Enter)
[1] FALSE FALSE FALSE FALSE FALSE
> is.bizday(Transition_Dates$Exit)
[1] FALSE FALSE FALSE FALSE FALSE

函数bypass禁用了调整,现在我必须找到一种干净的方法将该特性合并到bizdays中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36489237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档