【问题标题】:How to define holidays for is.holiday() chron package in R如何在 R 中为 is.holiday() chron 包定义假期
【发布时间】:2011-11-19 01:31:53
【问题描述】:

我正在尝试使用chronis.holiday() 函数,但我无法让它工作。文档说用您希望使用的假期修改.Holiday 对象,但is.holiday() 似乎没有检测到我对.Holiday 所做的更改。有人可以提供加载假期的适当方式的示例吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这很重要,可能值得将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)
    

    【讨论】:

    • 谢谢。这比我预期的要复杂得多。
    • 上述解决方案非常棒,并且有效,但如果 hlist 包含“GBNewYearsEve”似乎会出现错误,我已经在该 [链接] (stackoverflow.com/questions/26777282/…) /跨度>
    【解决方案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 
    

    【讨论】:

      【解决方案3】:

      在看了很多关于这个话题之后,我发现这个解决方案使用 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)
      

      希望对大家有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多