【问题标题】:get first and last day of each week using xts in R使用 R 中的 xts 获取每周的第一天和最后一天
【发布时间】:2013-04-20 11:28:13
【问题描述】:

我在post 中读到了这个绝妙的解决方案。我想获得两个时间序列对象。一个用于每周的第一天,另一个用于每周的最后一天。我的时间序列是不规则的,不包括周末和节假日。星期从星期一到星期日。这是我系列的开始:

         Date   Val WeekNum
1  01/02/1990 41.38       1
2  02/02/1990 42.88       1
3  05/02/1990 42.00       2
4  06/02/1990 41.50       2
5  07/02/1990 42.25       2
6  08/02/1990 41.75       2
7  09/02/1990 42.13       2
8  12/02/1990 42.13       3
9  13/02/1990 42.00       3
10 14/02/1990 42.63       3
11 15/02/1990 43.75       3
12 16/02/1990 44.75       3
13 20/02/1990 44.13       4
14 21/02/1990 43.88       4
15 22/02/1990 44.38       4
16 23/02/1990 44.00       4
17 26/02/1990 44.00       5
18 27/02/1990 44.88       5
19 28/02/1990 44.50       5
20 01/03/1990 44.63       5
21 02/03/1990 46.00       5
22 05/03/1990 45.88       6
23 06/03/1990 45.50       6
24 07/03/1990 45.38       6
25 08/03/1990 43.63       6
26 09/03/1990 41.50       6
27 12/03/1990 41.38       7
28 13/03/1990 40.63       7
29 14/03/1990 40.25       7
30 15/03/1990 40.50       7
31 16/03/1990 40.50       7
32 19/03/1990 40.25       8
33 20/03/1990 39.88       8
34 21/03/1990 39.75       8
35 22/03/1990 38.50       8
36 23/03/1990 38.75       8
37 26/03/1990 39.63       9
38 27/03/1990 39.75       9

然后我从参考帖子中使用:

library(xts)
do.call(rbind, lapply(split(x, "weeks"), function(x) x[1]))

编辑:它不起作用,因为我有 zoo 而不是 xts 的数据。

【问题讨论】:

  • 你有什么不明白的?
  • @Joshua Ulrich 我只从中获得了一个价值,但我希望在系列中获得尽可能多的星期一或星期五。如果缺少星期一或星期五,这也可以吗?
  • 您需要明确您想要的结果。您想要每周的第一次/最后一次观察,还是想要周一/周五的观察?
  • @Joshua Ulrich 我想先在每周的星期一/星期五,如果其中任何一个是假期,然后在星期二/星期四等。当说假期时,我指的是丢失的数据。

标签: r time-series xts


【解决方案1】:

您可以简单地使用firstlast 函数。您也可以使用headtail

# first/last
do.call(rbind, lapply(split(x, "weeks"), first))
do.call(rbind, lapply(split(x, "weeks"), last))
# head/tail
do.call(rbind, lapply(split(x, "weeks"), head, 1))
do.call(rbind, lapply(split(x, "weeks"), tail, 1))

【讨论】:

    【解决方案2】:

    您可以使用.indexwday 获取星期几。然后使用range 你得到第一个和最后一个。由于 并非所有周都从周一开始到周五结束,因此最好取每周的最小值和最大值。

    要获取每周的第一天和最后一天,您可以执行以下操作:

    do.call(rbind, lapply(split(dat.xts, "weeks"), 
                          function(y) y[.indexwday(y) %in% range(.indexwday(y))]))
    
    
    
                Val WeekNum
    1990-02-01 41.38       1
    1990-02-02 42.88       1
    1990-02-05 42.00       2
    1990-02-09 42.13       2
    1990-02-12 42.13       3
    1990-02-16 44.75       3
    1990-02-20 44.13       4
    1990-02-23 44.00       4
    1990-02-26 44.00       5
    1990-03-02 46.00       5
    1990-03-05 45.88       6
    1990-03-09 41.50       6
    1990-03-12 41.38       7
    1990-03-16 40.50       7
    1990-03-19 40.25       8
    1990-03-23 38.75       8
    1990-03-26 39.63       9
    1990-03-27 39.75       9
    

    【讨论】:

    • 非常感谢,效果很好。我接受 Joshua Ulrich 的解决方案,因为对我来说稍微容易一些。
    • @eccehomo 没问题。我也是,我更喜欢其他解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-07-21
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多