2013-12-20 29 views
4

我在R中有一個Date對象,並且想在此日期添加1個工作日。如果結果是假期,我希望日期遞增到下一個非假期日期。假設我的意思是紐約證券交易所假期。我怎樣才能做到這一點?在R中添加1個工作日迄今

例子:

mydate = as.Date("2013-12-24") 
mydate + 1 #this is a holiday so I want this to roll over to the 26th instead 
+0

一個假期在哪裏?美國的假期與中國有很大的不同......我想你會很難找到一個包含所有人的軟件包維護人員。但是,製作自己的查找表並跳到週六和週日的第二天是可行的。 – Justin

+0

好點:只是更新問題,以假設紐約假期 – Alex

+0

您是否設想使用假期表? –

回答

7

我可能會使用的timeDate::nextBizDay()roll=-Inf組合成立data.table查找日曆,就像這樣:

library(data.table) 
library(timeDate) 

## Set up a calendar for 2013 & 2014 
cal <- data.table(date=seq(from=as.Date("2013-01-01"), by=1, length=730), 
        key="date")  
cal2 <- copy(cal) 
cal2[,nextBizDay:=date+1] 
cal2 <- cal2[isBizday(as.timeDate(nextBizDay)),] 
cal <- cal2[cal,,roll=-Inf] 

## Check that it works 
x <- as.Date("2013-12-21")+1:10 
cal[J(x),] 
#   date nextBizDay 
# 1: 2013-12-22 2013-12-23 
# 2: 2013-12-23 2013-12-24 
# 3: 2013-12-24 2013-12-26 
# 4: 2013-12-25 2013-12-26 
# 5: 2013-12-26 2013-12-27 
# 6: 2013-12-27 2013-12-30 
# 7: 2013-12-28 2013-12-30 
# 8: 2013-12-29 2013-12-30 
# 9: 2013-12-30 2013-12-31 
# 10: 2013-12-31 2014-01-01 

## Or perhaps: 

lu <- with(cal, setNames(nextBizDay, date)) 
lu[as.character(x[1:6])] 
# 2013-12-22 2013-12-23 2013-12-24 2013-12-25 2013-12-26 2013-12-27 
# "2013-12-23" "2013-12-24" "2013-12-26" "2013-12-26" "2013-12-27" "2013-12-30" 
+0

這很好,謝謝喬希。完全回答問題。 – Alex

+0

我不認爲你不需要'data.table'。循環解決方案應該這樣做。 –

+0

@DirkEddelbuettel我很確定*你不需要'data.table'。當我想將工作日回滾到沒有任何後續工作日的日期時(或者您想描述這一點),它實際上只是我達成的精神上最接近的工具。 –

6

Lubridate不會幫助你,因爲它不工作天概念。

至少兩個包做的,他們都有一個金融彎曲:

  • RQuantLib有許多交流交換日曆(但它是一個相當大的包)

  • timeDate還具有日曆

這兩個軟件包都有不錯的文檔,這將允許您從工作示例中進行設置。

第三個選項(簡單使用)是將本地日曆存儲幾年並使用它。

編輯:這是一個快速RQuantLib例如:

R> library(RQuantLib) 
R> adjust(calendar="TARGET", dates=Sys.Date()+2:6, bdc = 0) 
    2013-12-22 2013-12-23 2013-12-24 2013-12-25 2013-12-26 
"2013-12-23" "2013-12-23" "2013-12-24" "2013-12-27" "2013-12-27" 
R> 

它只是移動的某一天(從參數dates)期待下BIZ一天。

+0

謝謝Dirk,非常感謝參考資料。 – Alex

2

holidayNYSE(year = getRmetricsOptions("currentYear"))timeDate包檢查isHoliday