我Date
在 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
我可能会使用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"
Lubridate 不会帮助您,因为它不是工作日的概念。
至少有两个套餐可以,而且它们都有财务倾向:
这两个软件包都有不错的文档,允许您从工作示例中进行设置。
第三种选择(用于简单用途)是将本地日历存储几年并使用它。
编辑:这是一个快速的 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
)向前移动到下一个商务日。
holidayNYSE(year = getRmetricsOptions("currentYear"))
isHoliday
还可以从timeDate
包裹中签出