在xts :: to.period()中如何获得周边界

时间:2016-09-17 21:02:56

标签: r xts

to.period的xts参考说: “重要的是要注意,默认情况下所有日期都将与每个期间的结尾对齐”

在下面我希望看到输出显示9/12或9/18作为日期输出。但 显然我做的事情不对。那么“对齐”是什么意思,我怎样才能获得边界?

x1 = xts(1.23, as.Date("2016-09-15"))

x1
           [,1]
2016-09-15 1.23

to.period(x1, period="weeks", indexAt="firstof")
           x1.Open x1.High x1.Low x1.Close
2016-09-15    1.23    1.23   1.23     1.23

to.period(x1, period="weeks", indexAt="lastof")
                    x1.Open x1.High x1.Low x1.Close
2016-09-15 00:00:00    1.23    1.23   1.23     1.23

然而

to.period(x1, period="months", indexAt="lastof")
           x1.Open x1.High x1.Low x1.Close
2016-09-30    1.23    1.23   1.23     1.23

非常感谢。

我在Windows 10上使用R 3.3.1

2 个答案:

答案 0 :(得分:3)

查看to.period()的来源,调用firstof()lastof()。它有几个月,几年,几个季度和几天的特殊处理,但不是几周:

    if (indexAt == "lastof") {
        ix <- as.POSIXlt(c(.index(xx)), tz = indexTZ(xx))
        if (period %in% c("years", "months", "quarters", 
            "days")) 
            index(xx) <- as.Date(lastof(ix$year + 1900, ix$mon + 
              1))
        else index(xx) <- lastof(ix$year + 1900, ix$mon + 
            1, ix$mday, ix$hour, ix$min, ix$sec)
    }

当您查看lastof(或firstof)的代码时,您会看到没有周处理,因为POSIX数据处理的工作方式(年,月,日,小时,分钟,秒) - 没有周的概念)。

似乎endpoints()(由to.period()调用)是唯一可以进行特殊周处理的地方。

我认为你可以自己每周进行一次全面/全面的讨论。例如。如果日期是POSIXct形式(自1970年以来的秒数),则除以604800(7天内的秒数),调用ceiling()floor(),然后乘以604800.(呃,我认为你需要在最后加上259200(3天内第二次),因为1970年1月1日,POSIXct时间的基础是星期四而不是星期天。)

答案 1 :(得分:1)

根据Darren Cook的提示,我决定采用以下方法重新编制索引

x1 = xts(1.23, as.Date("2016-09-15"))    
x1
           [,1]
2016-09-15 1.23
index(x1) = index(x1) - .indexwday(x1) # day of week in [0,6]
x1
           [,1]
2016-09-12 1.23