2010-12-30 7 views
6

[r] 데이터 프레임에서 몇 년 동안의 데이터 (영업일 (주말이나 공휴일 제외)에만 해당)가 있으며 두 번째 및 매월 5 일 (영업일 기준). 따라서 솔루션은 목록을 거치고 2 일 및 5 일 영업일을 결정하고 해당 날짜에 대해 데이터 및 전체 날짜을 얻은 다음 차이점을 찾아야합니다. 내가 dateTime에()를 사용하여 시도했지만이 주말과 휴일에 대한 핸디캡하지 않습니다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) 

: 같은

데이터 보인다. 어떤 제안이라도 고맙게 생각합니다.

+0

솔직히, 나는 더크의 대답을 읽을 때 의문을 이해했습니다. –

+0

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

답변

2

나는 2, 5 영업일 각 달의 데이터에 실제로 존재하는 제 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 유형은 영업일 기준으로 작동하지만 영업일 기준으로는 작동하지 않습니다. 영업일을 처리하려면 추가 논리가 필요합니다. 나는이 노력을 알고 :

  1. rMetrics의 일부입니다 timeDate 패키지는 달력

    의 번호를 가지고 내 RQuantLib 패키지 QuantLib

에서 논리에 의존하여도 그렇게 할 수
  • 다음은 RQuantLib의 두 가지 예제입니다.

    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>  
    
    01 23,516,

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

    "영업일"은 특정 도메인 외부에서 잘 정의되어 있지 않습니다. . 예를 들어 콜럼버스 데이 (Columbus day)에는 많은 관공서가 문을 닫지 만 뉴욕 증권 거래소 (New York Stock Exchange)는 그렇지 않습니다. – frankc

    +1

    유엔, 유엔/정착, 유엔/뉴욕 증권 거래소, 미국/보스턴 본드, 유엔/NERC 및 주말에만 필요한 "일정"을 선택할 수 있습니다. – 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 
    

    편집 :

    버전부터 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") 
    

    에 내장 된 몇 가지와 함께 제공됩니다.