如何为R中的is.holiday()chron包定义假期

时间:2011-09-16 23:30:20

标签: r

我正在尝试使用chron的{​​{1}}功能,但我无法让它发挥作用。文档说明要修改您希望使用的假期is.holiday()对象,但.Holiday似乎没有检测到我对.Holiday所做的更改。有人可以提供一个加载假期的适当方法的例子吗?

3 个答案:

答案 0 :(得分:9)

这非常重要,可能应该被称为chron维护者。

library(chron)
library(timeDate)
hlist <- c("CAVictoriaDay","CACanadaDay","CALabourDay")
(ss <- dates(sapply(sapply(hlist,holiday,year=2011),as.Date)))
.Holidays <- ss

(实际上在R中使用日期的人比我更常使用前面的东西更优雅的解决方案,没有那个双重的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)

答案 1 :(得分:2)

我试图做同样的事情并发现这篇较老的帖子。我不需要修改.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 

答案 2 :(得分:0)

在仔细研究了这个主题之后,我发现使用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)

我希望它能对某人有所帮助