2016-04-07 13 views
0

パッケージbizdaysを使用して2つの日付間の営業日数を計算しようとしています。 2つの日付の間の営業日を計算するのに使用するのは良い選択だが、特定の問題に関する投稿は使用していないという点で、多くの記事があります。私は現在、出力に問題があります。Bizdays関数が不正な値を返す

データの日付は秒から月の範囲で異なりますが、サンプルのdfの下では、1日以内の差異のみを表示します(問題が発生しているようです)。

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出力に下記比較する良い)非営業日を削除せずに計算を持っている3番目の列があります:

は、ここに私のDFです。ここで

は私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) 

はDFにbizdays出力を追加します。

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

私はbizdaysの父です。 これはバグであり、私はそれに取り組んでいます。あなたが望むものを得るためには、次のコードをお勧めします。このコードで

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デフォルト設定(adjust.fromとadjust.to)はExcelのNETWORKDAYSの挙動を再現するつもりので、私は

> bizdays(Transition_Dates$Enter, Transition_Dates$Exit) 
[1] 0 0 0 0 0 

という問題が表示されてしまいました。 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でその機能を組み込むためのクリーンな方法を把握する必要があります。

+0

ご迷惑をおかけして申し訳ありません。私はまだいくつかの他の日付で問題を抱えています。上記のカレンダーを使用すると、 'bizdays(" 2014-10-10 11:33:00 "、" 2014-10-16 10:03:00 ")'は3営業日を返しますが、 30am〜木曜日10:03)。 'bizseq(" 2014-10-10 11:33:00 "、" 2014-10-16 10:03:00 ")'を実行すると、4日のベクトルが返されます。今の回避策としてそれをお勧めしますか?これを日付ベクトルと組み合わせることはできますか?私は実験を試みます。 – Tunn

+0

今のところ私は 'bizdays'リターンに1を加えることを提案します。 'bizdays'は2つの日付の違いで、' bizdays( "2014-10-10 11:33:00"、 "2014-10-11 11:33:00")を呼び出すと '2ではなく1を返します。 'bizseq(" 2014-10-10 11:33:00 "、" 2014-10-11 11:33:00 ")'を呼び出すと、2つの日付のシーケンスが返されます。 'bizdays'は財務的な目的のために設計されたもので、私は他の用途に合わせてよりカスタマイズ可能にするための新しい方法について考えるつもりです。 –

+0

私は上記の私のコメントでコロンブスの日を忘れてしまった。あなたの最初の答えは素晴らしいです。再度、感謝します。 – Tunn

関連する問題