2016-04-07 14 views
0

Ich versuche, die Anzahl der Werktage zwischen zwei Daten mit dem Paket bizdays zu berechnen. Es gab viele Posts auf der Tatsache, dass es eine gute Option ist, um Geschäftstage zwischen zwei Daten zu berechnen, aber keine Beiträge zu bestimmten Problemen während der Verwendung. Ich habe derzeit ein Problem mit der Ausgabe.Bizdays Funktion gibt falsche Werte zurück

Ich habe Daten mit Unterschieden zwischen Daten von Sekunden bis Monaten, aber unten in meinem Beispiel df, werde ich nur die Unterschiede zeigen, die weniger als ein Tag sind (das sind wo das Problem scheint entstehen).

Hier ist meine 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)) 

Wie Sie sehen können, gibt es eine dritte Säule, die eine Berechnung ohne Entfernen arbeitsfreie Tage (gut zu vergleichen, unten an den bizdays Ausgang) hat.

Hier ist mein bizdays Kalender:

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) 

hinzufügen bizdays Ausgabe 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 

Ist gekommen, jemand über ein ähnliches Problem oder bin ich völlig fehlt etwas? Für die Mehrzahl der Beobachtungen rundet die Spalte bdays die Spalte Time_in_State korrekt auf oder ab, aber ich habe nicht herausgefunden, warum ich für einige davon -1 erhalten würde. Gibt es auch eine Möglichkeit, bizdays Ausgabe mit Dezimalstellen (z. B. 5.5, 12.11) zu haben? Ich habe nichts im Handbuch gesehen. Vielen Dank im Voraus.

Antwort

1

Ich bin Bizdays Vater. Dies ist ein Fehler und ich werde daran arbeiten, für den Moment, um zu bekommen, was Sie wollen, schlage ich den folgenden Code vor.

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) 

mit diesem Code habe ich

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

Das Problem erscheint, weil bizdays Standardeinstellungen (adjust.from und adjust.to) beabsichtigt Excel NETTOARBEITS Verhalten zu replizieren. Sobald from und to Argumente arbeitsfreie Tage sind, verursacht die Datumseinstellung seltsame Ergebnisse, auf die Sie hingewiesen haben.

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

Die Funktion bypass deaktiviert die Einstellung und jetzt habe ich einen sauberen Weg finden, um diese Funktion in bizdays einzuarbeiten.

+0

danke für die nachdenkliche antwort. Ich habe immer noch ein Problem mit anderen Daten. Mit dem obigen Kalender: 'bizdays (" 2014-10-10 11:33:00 "," 2014-10-16 10:03:00 ")' gibt 3 Arbeitstage zurück, sollte aber auf 4 runden (Freitag 11: 30 Uhr bis Donnerstag 10:03 Uhr). Wenn ich 'bizseq (" 2014-10-10 11:33:00 "," 2014-10-16 10:03:00 ")' starte, wird ein Vektor von 4 Tagen zurückgegeben. Empfehlen Sie das als Workaround für jetzt? Kann ich das mit einem Vektor von Daten zu/von verbinden? Ich werde versuchen, zu experimentieren. – Tunn

+0

Für jetzt würde ich vorschlagen, 1 zu "bizdays" zurückzukehren. 'bizdays' den Unterschied zwischen zwei Daten, so dass, wenn Sie' bizdays ("2014-10-10 11:33:00", "2014-10-11 11:33:00") aufrufen '' 1 statt 2, aber Wenn Sie 'bizseq (" 2014-10-10 11:33:00 "," 2014-10-11 11:33:00 ") aufrufen, wird eine Sequenz mit 2 Daten zurückgegeben. "Bizdays" wurde für finanzielle Zwecke entworfen und ich werde über neue Wege nachdenken, um es für andere Zwecke anpassbarer zu machen. –

+0

Whoops ich verpasste Columbus Day in meinem Kommentar oben. Deine erste Antwort funktioniert großartig. Danke noch einmal. – Tunn

Verwandte Themen