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
答案 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