Назначение номера недели во временном ряду для получения средней цены за неделю - PullRequest
2 голосов
/ 29 декабря 2011

Допустим, у меня есть временной ряд с ежедневными данными (рабочие дни), и я хотел бы организовать данные по рабочим неделям.(Понедельник-пятница) аналогично описанному на этой веб-странице ОВОС по фьючерсным ценам на сырую нефть:

http://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=RCLC1&f=D

Как вы можете видеть, цены хорошо организованынедель на этой веб-странице.Есть ли в R какая-нибудь функция, которая могла бы организовать данные подобным образом?

Вы можете получить данные в формате .xls по адресу: http://www.eia.gov/dnav/pet/hist_xls/RCLC1d.xls

Что я хотел бы сделать, этоприсвойте номер недели каждому ежедневному наблюдению примерно так: (посмотрите на столбец недель)

     Date Price weeks  day
 1983-04-04 29.44    1   Monday
 1983-04-05 29.71    1   Tuesday
 1983-04-06 29.92    1   Wednesday
 1983-04-07 30.17    1   Thursday
 1983-04-08 30.38    1   Friday
 1983-04-11 30.26    2   Monday
 ...
 ...

До сих пор я использовал функцию недели пакета lubridate, но он не работает должным образом.Кажется, что раз в год попадает на 53-ю неделю, функция не может правильно инициировать неделю следующего года.

Я пытался держаться подальше от решений типа rep, seq / 5 или / 7, так как могут быть некоторые наблюдения, которые мне, возможно, потребуется отфильтровать по данным позже, поэтому я хотел бы получитьрешение, которое не зависит от конкретного вектора моих данных, а скорее я предпочел бы, чтобы решение было более общим, то есть зависело от класса даты, то есть POSIcxt, xts или zoo class

Любые подсказкис благодарностью.

1 Ответ

2 голосов
/ 29 декабря 2011

Разве это не сработает?:

as.POSIXlt()$yday %/% 7

Я понимаю, что у него есть часть того, чего вы хотели избежать, но оно черпает свою отправную точку из признанного класса. Для ваших данных, отметив, что я прочитал это с colClasses=c("Date", "numeric","numeric","character"):

> 1 + as.POSIXlt(dat$Date)$yday %/% 7
[1] 14 14 14 14 14 15

Если вы хотите скопировать эти интервальные метки, попробуйте добавить кратные 7 для любого понедельника и пятницы:

 paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(39)*7, 
         " to ", 
         as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(39)*7,
         sep="")
@[1] "1984-01-02 to 1984-01-06" #  The first new year change
 paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(39+52)*7, 
         " to ", 
         as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(39+52)*7,
         sep="")
#[1] "1984-12-31 to 1985-01-04"  #  The second new year change

Вот функция, которая будет принимать целочисленный вектор:

from8Apr83dts <- function(numwks) { 
     paste(as.Date(strptime("1983 Apr- 4",format="%Y %b- %d"))+(numwks)*7, 
          " to ", 
          as.Date(strptime("1983 Apr- 8",format="%Y %b- %d"))+(numwks)*7,
          sep="") 
                                   }
# Usage
from8Apr83dts(39:40)
#[1] "1984-01-02 to 1984-01-06" "1984-01-09 to 1984-01-13"
...