2010-12-30 5 views
6

[r]データフレームに数年間のデータ(営業日(週末または休日なし)のみ)があり、2番目と毎月5営業日。したがって、ソリューションはリストを通って2日目と5日目の営業日を決定し、対応する日付のデータと完全な日付を取得し、その差異を見つける必要があります。r - 営業日の差異を見つける

データは次のようになります。

1/19/1990 1.22 

1/20/1990 1.25 

1/23/1990 1.26 ## (Gap in date is weekend) 

... 

2/1/1990 1.34 

2/2/1990 1.36 

2/5/1990 1.22 ## (Gap in date is weekend) 

私は(dateTime型を使用してみましたが)、それは、週末や休日のためにハンディキャップをしません。ご意見ありがとうございます、ありがとうございます。

+0

正直なところ、私はダークの答えを読んだときの質問を理解しました。 –

+0

http://stackoverflow.com/questions/38448310/r-finding-difference-in-business-days/38448463#38448463 – Sathish

答えて

2

私は第二と第五営業日であなたはその第二および各月のデータでは、実際に存在するデータの5日目を意味することを想定しています。それが問題ならば、それは次のようになります。データを読み込み、最初の列を"Date"クラスに変換します。次に、必要な差額を月単位で集計します。この以来

library(zoo) 
library(chron) 
read.zoo(text = Lines, FUN = chron, FUN2 = as.yearmon, 
    aggregate = function(x) if (length(x) >= 5) x[5] - x[2] else NA) 

更新が最初read.tabletext=引数を書かれたとread.zooがRに添加し、答えがされています:動物園やクロンを使用して

Lines <- "1/19/1990 1.22 
1/20/1990 1.25 
1/23/1990 1.26 
1/24/1990 1.26 
1/25/1990 1.26 
1/26/1990 1.26 
2/1/1990 1.34 
2/2/1990 1.36 
2/5/1990 1.22 
2/6/1990 1.22 
2/7/1990 1.22 
2/8/1990 1.22" 

DF <- read.table(text = Lines, col.names = c("Date", "Value")) 
DF$Date <- as.Date(DF$Date, "%m/%d/%Y") 
aggregate(DF$Value, list(ym = format(DF$Date, "%Y-%m")), 
    function(x) if (length(x) >= 5) x[5] - x[2] else NA) 

read.zoo経由で完全に行うことができ、それこれを使用するように更新されました。

+0

これは私が必要としていたものです....ありがとうございました!!!! – acesnap

16

基本的なDateタイプは、祝日には使用できますが、営業日には使用できません。営業日を管理するためには余分なロジックが必要です。私は2人の努力を認識しています:rMetricsの一部である

  1. timeDateパッケージには、私のRQuantLibパッケージはQuantLib

からロジックに依存することでもそうカレンダー

  • の数を行うことができました

    ここにはRQuantLibの2つの例がありますが、他の多くの関連する関数があります。

    R>  from <- as.Date("2009-04-07") 
    R>  to <-as.Date("2009-04-14") 
    R>  getHolidayList("UnitedStates", from, to) 
    NULL 
    R>  to <- as.Date("2009-10-7") 
    R>  getHolidayList("UnitedStates", from, to) 
    [1] "2009-05-25" "2009-07-03" "2009-09-07" 
    R>  
    

    R>  from <- as.Date("2009-04-07") 
    R>  to<-as.Date("2009-04-14") 
    R>  businessDaysBetween("UnitedStates", from, to) 
    [1] 5 
    R> 
    
  • +1

    私は、「営業日」は特定のドメインの外部でよく定義されているわけではないことに注意してください。例えば、多くの官庁はコロンバスの日に閉鎖されていますが、ニューヨーク証券取引所は閉鎖されていません。 – frankc

    +1

    あなたは、必要な「カレンダー」を選ぶことができます:UnitedStates、UnitedStates/Settlement、UnitedStates/NYSE、UnitedStates/GovernmentBond、UnitedStates/NERC、WeekendsOnly – nvogen

    1

    ここでは、休日に対応する開始日、終了日、およびベクトルを入力して(非標準の休日カレンダーを使用している場合に便利な)小さな関数を使用して、それらの間の作業日数を返します。開始日と終了日の両方をカウントすることは

    workdays = function(iniDate, endDate, holidays) { 
        theDates = seq(from=iniDate,to=endDate,by="day") 
        isHoliday = theDates %in% holidays 
        isWeekend = (as.POSIXlt(theDates)$wday) %in% (c(0,6)) 
        return (sum(!isHoliday & !isWeekend)) 
    } 
    
    1

    あなたはパッケージbizdaysを使用して営業日の違いを見つけることができますが、休日(非稼働日)のリストを持っている必要があり、それはあなたのケースではありません。とにかく、他人を助けることができると思います。

    bizdaysの場合、次のコードは2つの日付間の営業日数を計算します。

    library(bizdays) 
    cal <- Calendar(holidaysANBIMA, weekdays=c('sunday', 'saturday'), dib=252) 
    from_dates <- c('2013-07-12', '2012-06-13') 
    to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months') 
    bizdays(from_dates, to_dates, cal = cal) 
    
    ## [1] 153 442 194 483 234 526 276 570 321 613 364 655 404 695 
    ## [15] 446 735 486 779 529 822 571 863 614 904 654 946 695 987 
    ## [29] 738 1029 
    

    EDIT:

    バージョン1.0.0 bizdays以来Calendar機能は廃止される予定のカレンダー

    library(bizdays) 
    from_dates <- c('2013-07-12', '2012-06-13') 
    to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months') 
    bizdays(from_dates, to_dates, cal = "Brazil/ANBIMA") 
    

    に建てられたいくつか付属しています。

    関連する問題