2016-04-07 27 views
0

İki tarih arasındaki iş günlerinin sayısını hesaplamak için bizdays paketini kullanarak hesaplamaya çalışıyorum. İki tarih arasında iş günlerini hesaplamak için kullanmak için iyi bir seçenek olduğu, ancak bunu kullanırken belirli konularda herhangi bir gönderi olmadığı konusunda pek çok yayın vardır. Şu anda çıktıyla ilgili bir sorun yaşıyorum.Bizdays işlevi yanlış değerler döndürüyor

Saniyelerimden aylara kadar olan tarihler arasındaki farklara sahip verilerim var, ancak örneklemde df'nin altında, yalnızca bir günden daha az olan farklılıkları göstereceğim (bunlar sorunun ortaya çıktığı yerlerdir).

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

Gördüğünüz gibi, (bizdays çıkışına aşağıda karşılaştırmak için iyi) olmayan iş günü çıkarmadan OLMADAN bir hesaplama olan bir üçüncü sütun vardır:

İşte benim df olduğunu.

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 

kimse benzer bir sorun rastlamak Has veya tamamen eksik bir şey duyuyorum:

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 için bizdays çıktı ekleyin: Burada

benim bizdays takvimdir? Gözlemlerin çoğunda, bdays sütunu Time_in_State sütunundan yukarı veya aşağı doğru yuvarlanır, ancak neden bunlardan bazıları için bana -1 vereceğini anlayamadım. Ayrıca, ondalıklı bizdays çıkışa sahip olmanın bir yolu var mı (ör., 5.5, 12.11)? Kılavuzda hiçbir şey görmedim. Şimdiden çok teşekkür ederim.

cevap

1

Ben de bugünün babasıyım. Bu bir BUG ve üzerinde çalışacağım, şu an için istediğin şeyi almak için aşağıdaki kodu öneririm. Bu kod ile

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) 

Ben bizdays varsayılan ayarları (adjust.from ve adjust.to) Excel NETWORKDAYS davranışını çoğaltmak niyetinde Çünkü sorun görünür

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

aldık. from ve to argümanları çalışmadığı günlerde, tarih ayarlaması işaret ettiğiniz garip sonuçlara neden olur.

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

fonksiyon bypass ayarı devre dışı bırakır ve şimdi bizdays bu özelliği dahil etmek temiz bir çıkış yolu bulmalıyız.

+0

Düşünceli yanıt için teşekkür ederiz. Yine başka tarihlerle de bir sorun yaşıyorum. Yukarıdaki takvimi kullanarak: 'bizdays (" 2014-10-10 11:33:00 "," 2014-10-16 10:03:00 ")" 3 iş günü döndürür, ancak 4'e (Cuma 11: 30:00 - Perşembe 10:03. Eğer bizseq ("2014-10-10 11:33:00", "2014-10-16 10:03:00") 'yi çalıştırırsam, 4 günlük bir vektör döndürür. Şimdilik bir çözüm olarak bunu önerir misiniz? Bunu, tarihleri ​​arasındaki bir tarihle birleştirebilir miyim? Denemeyi deneyeceğim. – Tunn

+0

Şimdilik 1'e 'bizdays' dönüşünü eklemeyi öneriyorum. 'bizdays' iki tarih arasındaki farkı, böylece 'bizdays' ("2014-10-10 11:33:00", "2014-10-11 11:33:00") 'i çağırırsanız, 2 yerine 1 döndürür, ancak bizseq ("2014-10-10 11:33:00", "2014-10-11 11:33:00") 'i çağırırsanız, 2 tarih içeren bir sıra döndürür. “bizdays” finansal amaçlar için tasarlandı ve diğer kullanımlar için daha özelleştirilebilir hale getirmenin yeni yollarını düşüneceğim. –

+0

Başarımdaki Columbus Day'ı kaçırdım. İlk cevabın harika çalışıyor. Tekrar teşekkürler. – Tunn

İlgili konular