【问题标题】:Assigning week numbers in a time series to obtain weekly average price在时间序列中分配周数以获得每周平均价格
【发布时间】:2012-01-29 13:23:02
【问题描述】:

假设我有一个包含每日数据(工作日)的时间序列,我想按工作日组织数据。 (周一至周五)以与 EIA 原油期货价格网页中类似的方式:

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 类

任何提示将不胜感激。

【问题讨论】:

  • 我在下面看到了你的 cmets,但你仍然没有说出你想要的数字作为跨越一年增量的周数。
  • 所以你不想要一个数字;你只想要一周的跨度
  • 如果您想为两年后的星期分配一个数字,那么您需要告诉我们要分配的数字。

标签: r date time-series


【解决方案1】:

这不行吗?:

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"

【讨论】:

  • 从链接的示例数据来看,@AndresT 似乎希望这些是工作周,因此周一到周五总是在同一周。一种可能性是使用strftime(as.POSIXlt(dat$Date), format="%W"),但这并不总是将跨越两年的一周中的日子联系起来(例如,12 月 31 日星期一和 1 月 4 日星期五)。也许@AndresT 可以澄清他想在这几周内完成什么......
  • 您说您希望它看起来像您提供的示例一样。那就是我所做的。每周间隔与您链接到的网站中的间隔相匹配。如果您想要不同的东西,请提供明确的说明。无论如何我得到工作日(as.Date(“1984-01-02”))[1]“星期一”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2016-06-29
  • 2012-08-07
  • 1970-01-01
  • 2023-04-10
  • 2017-04-17
  • 2016-09-07
相关资源
最近更新 更多