2016-07-19 7 views
1

営業日の日付差を計算する、つまりExcelのネットワーク日付機能のような週末を除外するのに問題がある。R:営業日の差異を見つける

ここは私のデータです。

e <- structure(list(date.pr = structure(c(15909, 15933, 16517, 15961, 15974, 15978), class = "Date"), date.po = structure(c(15909, 15933, 15954, 15961, 15974, 15978), class = "Date")), .Names = c("date.1", "date.2"), class = c("tbl_df", "data.frame"), row.names = c(NA, -6L)) 

このタスクの「bizdays」パッケージが見つかりました。どちらがうまくいくのでしょうか。

> bizdays(e$date.2,e$date.1) 
[1] 0 0 563 0 0 0 

しかし、私のデータには、日付2が日付1より前の場合が含まれます。

e2 <- structure(list(date.pr = structure(c(15909, 15933, 16517, 15961, 5974, 15978, 15978), class = "Date"), date.po = structure(c(15909, 15933, 15954, 15961, 15974, 15978, 15979), class = "Date")), .Names = c("date.1", "date.2"), class = c("tbl_df", "data.frame"), row.names = c(NA, -7L)) 

今では、次のエラー得られます。

> cal <- Calendar(holidaysANBIMA, weekdays=c("saturday","sunday")) 
> bizdays(e2$date.2,e2$date.1,cal) 
Error in bizdays.Date(e2$date.2, e2$date.1, cal) : 
    All from dates must be greater than all to dates. 

を私はifelse()のロジックを使用して考えていますが、それは私に同じエラーを与えます。

> ifelse(e2$date.2 < e2$date.1, NA, bizdays(e2$date.2,e2$date.1,cal)) 
Error in bizdays.Date(e2$date.2, e2$date.1, cal) : 
    All from dates must be greater than all to dates. 

ヘルプありがとうございました。

+0

http://stackoverflow.com/questions/4559175/r-finding-difference-between-business-daysは、問題を解決しました。 – woshishui

答えて

1

Nweekdays()機能は@Jから適応されています。勝った。解答:Calculate the number of weekdays between 2 dates in R

この変更された関数は、肯定的または否定的な日付差異を考慮に入れます。 上記のリンクは正の日付差の解決策を受け入れています。パッケージ "RQuantLib" からbusinessDaysBetweenを使用して

library("dplyr") 

e2 <- structure(list(date.pr = structure(c(16524, 16524, 16507, 16510, 16510, 16524, 16510, 5974), class = "Date"), 
        date.po = structure(c(16524, 16525, 16510, 16517, 16524, 16510, 16531, 15974), class = "Date")), 
       .Names = c("date.1", "date.2"), class = c("tbl_df", "data.frame"), row.names = c(NA, -8L)) 

Nweekdays <- Vectorize(
    function(a, b) 
    { 
    ifelse(a < b, 
      return(sum(!weekdays(seq(a, b, "days")) %in% c("Saturday", "Sunday")) - 1), 
      return(sum(!weekdays(seq(b, a, "days")) %in% c("Saturday", "Sunday")) - 1)) 
    }) 


> e2 %>% 
    mutate(wkd1 = format(date.1, "%A"), 
      wkd2 = format(date.2, "%A"), 
      ndays_with_wkends = ifelse((date.2 > date.1), (date.2 - date.1), (date.1 - date.2)), 
      ndays_no_wkends = Nweekdays(date.1, date.2)) 

Source: local data frame [8 x 6] 

     date.1  date.2 wkd1  wkd2 ndays_with_wkends ndays_no_wkends 
     (date)  (date) (chr) (chr)    (dbl)   (dbl) 
1 2015-03-30 2015-03-30 Monday Monday     0    0 
2 2015-03-30 2015-03-31 Monday Tuesday     1    1 
3 2015-03-13 2015-03-16 Friday Monday     3    1 
4 2015-03-16 2015-03-23 Monday Monday     7    5 
5 2015-03-16 2015-03-30 Monday Monday    14    10 
6 2015-03-30 2015-03-16 Monday Monday    14    10 
7 2015-03-16 2015-04-06 Monday Monday    21    15 
8 1986-05-11 2013-09-26 Sunday Thursday    10000   7143 

> e2 %>% mutate(ndays_no_wkends = Nweekdays(date.1, date.2)) 

Source: local data frame [8 x 3] 

     date.1  date.2 ndays_no_wkends 
     (date)  (date)   (dbl) 
1 2015-03-30 2015-03-30    0 
2 2015-03-30 2015-03-31    1 
3 2015-03-13 2015-03-16    1 
4 2015-03-16 2015-03-23    5 
5 2015-03-16 2015-03-30    10 
6 2015-03-30 2015-03-16    10 
7 2015-03-16 2015-04-06    15 
8 1986-05-11 2013-09-26   7143 
+0

ありがとう@Satish。私はあなたのロジックを分割してデータをバインドし直します。私は良い方法があるべきだと思います。単純な日付の違いを達成するためにifelse(date.1> date.2、NA、date.2 - date.1)を使用できますが、就業日の要件は複雑です。 – woshishui

+0

ありがとうございますが、週末は除外されていますか?例えば現在の月曜日 - 前回の金曜日は3でなく1でなければなりません。 – woshishui

+0

もう一度@ Sathishに感謝します。私はbusinessDaysBetween()がRQuantLibパッケージからうまくいくと思います。 – woshishui

関連する問題