在xts / zoo中设置秒数

时间:2013-05-28 15:39:59

标签: r xts zoo

是否有可能在xts中对子集进行子集化?

2013-01-01 00:01:00 2.2560000
2013-01-01 00:02:00 2.3883333
2013-01-01 00:03:00 1.8450000
2013-01-01 00:04:00 1.6966667
2013-01-01 00:04:03 1.3100000
2013-01-01 00:05:00 0.8533333

我想让这条线没有:00秒结束!

2013-01-01 00:04:03 1.3100000

通常我会按时间[T09:00 / T09:30]进行子集,但是现在我想要的是没有时间戳的行为00秒。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,我必须将您的示例数据导入R(下次请使用dput

lines <- '2013-01-01 00:01:00 2.2560000
2013-01-01 00:02:00 2.3883333
2013-01-01 00:03:00 1.8450000
2013-01-01 00:04:00 1.6966667
2013-01-01 00:04:03 1.3100000
2013-01-01 00:05:00 0.8533333'

tmp <- read.table(text=lines)
x <- xts(tmp[, 3], as.POSIXct(paste(tmp[, 1], tmp[, 2])))

您可以使用.indexsec函数提取第二个(或不是)0的行。

x[.indexsec(x) == 0]
#                         [,1]
#2013-01-01 00:01:00 2.2560000
#2013-01-01 00:02:00 2.3883333
#2013-01-01 00:03:00 1.8450000
#2013-01-01 00:04:00 1.6966667
#2013-01-01 00:05:00 0.8533333

x[.indexsec(x) != 0]
#                    [,1]
#2013-01-01 00:04:03 1.31

另一个想法是使用类似于xts:::startof函数的未导出的endpoints函数。

x[xts:::startof(x, "mins")]
#                         [,1]
#2013-01-01 00:01:00 2.2560000
#2013-01-01 00:02:00 2.3883333
#2013-01-01 00:03:00 1.8450000
#2013-01-01 00:04:00 1.6966667
#2013-01-01 00:05:00 0.8533333

或者,如果您只有一行不以00结尾,则可以使用否定子集:

x[-xts:::startof(x, "mins")]
#                    [,1]
#2013-01-01 00:04:03 1.31

以下是如何通过合并具有所需索引的零宽度xts对象来实现此目的。

merge(xts(, seq(start(x), end(x), by="min")), x, all=FALSE)
#                            x
#2013-01-01 00:01:00 2.2560000
#2013-01-01 00:02:00 2.3883333
#2013-01-01 00:03:00 1.8450000
#2013-01-01 00:04:00 1.6966667
#2013-01-01 00:05:00 0.8533333