# [R] time series by calendar week

Gabor Grothendieck ggrothendieck at gmail.com
Tue Jul 8 20:37:29 CEST 2008

```On Tue, Jul 8, 2008 at 10:25 AM, collonil <manitz.juliane at web.de> wrote:
>
> hello,
>
> i cant find a solution on this (might be) easy problem:
>
> i have a time serie by carlandar weeks, so for every carlendar week i have a
> value. now i would like to use the functions for time series, so i change
> structur to a time serie with
>
> cam <- ts(number,start=c(2001,1),deltat=7/365)
> or
> cam <- ts(number,start=c(2001,1),frequency=52)
>
> the problem on it is, that 2004 had 53 calendar weeks, which is not
> recognized there.
> it follows with using a saisonal structure the weeks are shifting. f.e.
> first week in 2005 is conected with the second week in 2004.
> with the first function leap years are not recognized.
>
> is there another function which is recognizing irregularities in the
> calendar?
>

I assume the main problem is that you want to convert it to a series
that has an integral number of cycles per year.    To do that some
approximation will be required such as:

- omit anything past 52 weeks from each year, or
- create a grid of freq points per year and then take the last
point in each grid section or the mean of all points in each grid
section

Here is an example using a grid of 52 points per year:

# Suppose we have this data:
library(zoo)
set.seed(1)
z <- zooreg(1:100 + rnorm(100), start = as.Date("2001-01-01"), deltat = 7)

# new.freq() converts dates to a grid of freq points per year
# yd is sequence of dates of firsts of years
# yy is years of the same sequence
# last line interpolates so dates, d, are transformed to year + frac of year
new.freq <- function(d, freq = 52) {
y <- as.Date(cut(range(d), "years")) + c(0, 367)
yd <- seq(y[1], y[2], "year")
yy <- as.numeric(format(yd, "%Y"))
ceiling(freq * approx(yd, yy, xout = d)\$y) / freq
}

# take last point in each period
aggregate(z, new.freq, tail, 1)

# or, take mean of all points in each period
aggregate(z, new.freq, mean)

```