Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define holidays for is.holiday() chron package in R

Tags:

r

I'm trying to use chron's is.holiday() function, but I'm having trouble getting it to work. The documentation says to modify the .Holiday object with the holidays that you wish to use, but the changes I've made to .Holiday don't seem to be detected by is.holiday(). Could someone provide an example of the appropriate way to load holidays?

like image 915
matt_k Avatar asked Sep 16 '11 23:09

matt_k


Video Answer


2 Answers

This is non-trivial and probably deserves to be referred to the chron maintainer as a bug.

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

(Someone who actually works with dates in R more often than I do probably has a more elegant solution for the preceding stuff, without that double-sapply thing ...)

But this doesn't change the important thing, which is the version of Holidays in the chron namespace:

chron::.Holidays  ## no change

The clue is here: Override a function that is imported in a namespace

Namespace magic:

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"))

Now look, and it has worked:

chron::.Holidays

Test it out:

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)
like image 106
Ben Bolker Avatar answered Nov 19 '22 19:11

Ben Bolker


I was trying to do the same thing and found this older post. I didn't need to modify .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 
like image 21
ideamotor Avatar answered Nov 19 '22 19:11

ideamotor