【发布时间】:2011-11-19 01:31:53
【问题描述】:
我正在尝试使用chron 的is.holiday() 函数,但我无法让它工作。文档说用您希望使用的假期修改.Holiday 对象,但is.holiday() 似乎没有检测到我对.Holiday 所做的更改。有人可以提供加载假期的适当方式的示例吗?
【问题讨论】:
标签: r
我正在尝试使用chron 的is.holiday() 函数,但我无法让它工作。文档说用您希望使用的假期修改.Holiday 对象,但is.holiday() 似乎没有检测到我对.Holiday 所做的更改。有人可以提供加载假期的适当方式的示例吗?
【问题讨论】:
标签: r
这很重要,可能值得将chron 维护者视为一个错误。
library(chron)
library(timeDate)
hlist <- c("CAVictoriaDay","CACanadaDay","CALabourDay")
(ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
.Holidays <- ss
(实际上在 R 中使用日期比我更频繁的人可能对前面的东西有一个更优雅的解决方案,没有那个 double-sapply 的东西......)
但这并没有改变重要的事情,即Holidays的版本在chron命名空间:
chron::.Holidays ## no change
线索在这里:Override a function that is imported in a namespace
命名空间魔法:
unlockBinding(".Holidays", as.environment("package:chron"))
assignInNamespace(".Holidays", .Holidays, ns="chron",
envir=as.environment("package:chron"))
assign(".Holidays", .Holidays, as.environment("package:chron"))
lockBinding(".Holidays", as.environment("package:chron"))
现在看,它已经奏效了:
chron::.Holidays
测试一下:
yrvec <- seq.Date(as.Date("2011-01-01"),
as.Date("2011-12-31"),by="day")
plot(is.holiday(yrvec),axes=FALSE)
axis.Date(side=1,yrvec)
【讨论】:
我试图做同样的事情并找到了这篇较旧的帖子。我不需要修改.Holidays:
library(timeDate);library(chron)
hlist <- c("USChristmasDay","USGoodFriday","USIndependenceDay","USLaborDay",
"USNewYearsDay","USThanksgivingDay")
myholidays <- dates(as.character(holiday(2000:2013,hlist)),format="Y-M-D")
> is.holiday(as.Date("2013-11-28"),myholidays)
[1] TRUE
> chron::.Holidays
New Years Day Memorial Day Independence Day Labor Day Thanksgiving Christmas
01/01/92 05/25/92 07/04/92 09/07/92 11/26/92 12/25/92
【讨论】:
在看了很多关于这个话题之后,我发现这个解决方案使用 RQuantLib 包特别简单,所以也许 RQuantLib 在这方面可能更简单。
install.packages("RQuantLib")
library(RQuantLib)
isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)
您可以使用不同的日历修改此代码,以便为周末添加不同国家/地区的不同假期集(以下仅为示例,但还有更多示例)。
isBusinessDay(calendar="UnitedStates", dates=yourdatesofinterest)
isBusinessDay(calendar="UnitedStates/Settlement", dates=yourdatesofinterest)
isBusinessDay(calendar="UnitedStates/NYSE", dates=yourdatesofinterest)
isBusinessDay(calendar="Sweden", dates=yourdatesofinterest)
isBusinessDay(calendar="Mexico", dates=yourdatesofinterest)
希望对大家有所帮助
【讨论】: