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
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
After looking a lot about this topic, I found this solution particularly simple using the package RQuantLib, so maybe RQuantLib might be more simple in this regard.
install.packages("RQuantLib")
library(RQuantLib)
isBusinessDay(calendar="WeekendsOnly", dates=yourdatesofinterest)
You can modify this code with different calendars to add to the weekends different sets of holidays in different countries (below just an example, but they have many more).
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)
I hope it helps somebody
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)