4
votes

I noticed some strange xts behaviour when trying to split an object that goes back a long way. The behaviour of split changes at the epoch.

#Create some data
dates <- seq(as.Date("1960-01-01"),as.Date("1980-01-01"),"days")
x <- rnorm(length(dates))
data <- xts(x, order.by=dates)

If we split the xts object by week, it defines the last day of the week as Monday prior to 1970. Post-1970, it defines it as Sunday (expected behaviour).

#Split the data, keep the last day of the week
lastdayofweek <- do.call(rbind, lapply(split(data, "weeks"), last))
head(lastdayofweek)
tail(lastdayofweek)

1960 Calendar

1979 Calendar

This seems to only be a problem for weeks, not months or years.

#Split the data, keep the last day of the month
lastdayofmonth <- do.call(rbind, lapply(split(data, "months"), last))
head(lastdayofmonth)
tail(lastdayofmonth)

The behaviour seems likely to do with the following, though I am not sure why it would apply to weeks only. From the xts cran.

For dates prior to the epoch (1970-01-01) the ending time is aligned to the 59.0000 second. This is due to a bug/feature in the R implementation of asPOSIXct and mktime0 at the C-source level. This limits the precision of ranges prior to 1970 to 1 minute granularity with the current xts workaround.

My workaround has been to shift the dates before splitting the objects for data prior to 1970, if I am splitting on weeks. I expect someone else has a more elegant solution (or a way to avoid the error).

EDIT: To be clear as to what the question is, I am looking for an answer that a) specifies why this happens (so I can understand the nature of the error better, and therefore avoid it) and/or b) the best workaround to deal with it.

1
Bug reports should be e-mailed to the maintainer or filed on the project's webpage. - GSee

1 Answers

4
votes

One "workaround" would be to check out Rev. 743 or earlier, as it appears to me that this broke in Rev. 744.

svn checkout svn://svn.r-forge.r-project.org/svnroot/xts/@743

But, a much better idea is to file a bug report so that you don't have to use an old version forever. (also, of course, other bugs may have been patched and/or new features added since Rev. 743)