Sergey Goriatchev
2009-Oct-14 14:39 UTC
[R] Taking specific/timed differences in a zoo timeseries
Hello everyone. I have a specific problem that I have difficulties to solve. Assume I have a zoo object: set.seed(12345) data <- round(runif(27)*10+runif(27)*5, 0) dates <- as.Date(c("09/03/09", "09/04/09", "09/07/09", "09/09/09", "09/10/09", "09/11/09", "09/14/09", "09/16/09", "09/17/09", "09/18/09", "09/21/09", "09/22/09", "09/23/09", "09/24/09", "09/25/09", "09/28/09", "09/29/09", "09/30/09", "10/01/09", "10/02/09", "10/05/09", "10/06/09", "10/07/09", "10/08/09", "10/09/09", "10/13/09", "10/14/09"), "%m/%d/%y") temp <- zoo(data, order.by=dates) What I need to do is to take differences between say October 14th and September 14, then October 13th and September 13th, that is 1 month difference independent of number of days inbetween. And when there is no matching date in an earlier month, like here where there is no September 13th, the date should be the first preceding date, that is September 11th in this example. How can I do that? The above is just an example, my zoo object is very big and I need to take differences between years, that is between October 14th, 2009 and October 14th, 2008, then Oct.13, 2009 and Oct.13, 2008, and so on. Also, the time index of my zoo object has format "10/14/09" (that is Oct.14, 2009), and that is the format I need to operate with and do not want to change. In the example I reformated just so that I can create a zoo object. Could some friendly person please show me how to do such a calculation? Thank you in advance! Best, Sergey
Gabor Grothendieck
2009-Oct-14 15:03 UTC
[R] Taking specific/timed differences in a zoo timeseries
Try this: library(zoo) # temp <- ... from post asking question # create a day sequence, dt, with no missing days # and create a 0 width series with those times. # merge that with original series giving original # series plus a bunch of times having NA values. # Use na.locf to fill in those values with the last # non-missing so far. rng <- range(time(temp)) dt <- seq(rng[1], rng[2], "day") temp.m <- na.locf(merge(temp, zoo(, dt))) # create a lagged time scale and subtract the # lagged series from original dt.lag <- as.Date(as.yearmon(dt)+1/12) + as.numeric(format(dt, "%d")) - 1 temp - zoo(coredata(temp.m), dt.lag) Using your data the output from the last line is:> temp - zoo(coredata(temp.m), dt.lag)2009-10-05 2009-10-06 2009-10-07 2009-10-08 2009-10-09 2009-10-13 2009-10-14 -5 -6 3 2 -2 2 1 On Wed, Oct 14, 2009 at 10:39 AM, Sergey Goriatchev <sergeyg at gmail.com> wrote:> Hello everyone. > > I have a specific problem that I have difficulties to solve. > Assume I have a zoo object: > > set.seed(12345) > data <- round(runif(27)*10+runif(27)*5, 0) > dates <- as.Date(c("09/03/09", "09/04/09", "09/07/09", "09/09/09", > "09/10/09", "09/11/09", "09/14/09", "09/16/09", "09/17/09", > "09/18/09", "09/21/09", "09/22/09", "09/23/09", > "09/24/09", "09/25/09", "09/28/09", "09/29/09", "09/30/09", > "10/01/09", "10/02/09", "10/05/09", "10/06/09", "10/07/09", > "10/08/09", "10/09/09", "10/13/09", "10/14/09"), "%m/%d/%y") > temp <- zoo(data, order.by=dates) > > What I need to do is to take differences between say October 14th and > September 14, then October 13th and September 13th, that is 1 month > difference independent of number of days inbetween. And when there is > no matching date in an earlier month, like here where there is no > September 13th, the date should be the first preceding date, that is > September 11th in this example. How can I do that? > > The above is just an example, my zoo object is very big and I need to > take differences between years, that is between October 14th, 2009 and > October 14th, 2008, then Oct.13, 2009 and Oct.13, 2008, and so on. > Also, the time index of my zoo object has format "10/14/09" (that is > Oct.14, 2009), and that is the format I need to operate with and do > not want to change. In the example I reformated just so that I can > create a zoo object. > > Could some friendly person please show me how to do such a calculation? > > Thank you in advance! > > Best, > Sergey > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >