为日期范围和时间范围子集化xts系列

时间:2016-08-22 20:16:35

标签: r xts

是否可以一次性为日期和时间范围分配xts系列?例如,在下面的系列中,我想仅为6:30-6:50选择行,并且仅针对一个月的01-04(或者更好的是,一个月的前4个数据日期,但这是一个无关的问题)。

spy[,ohlcv]
                         open    high     low   close  volume
2016-05-19 06:30:00   204.030 204.300 203.900 204.100  537530
2016-05-19 06:35:00   204.100 204.340 204.010 204.240  482436
2016-05-19 06:40:00   204.250 204.540 204.240 204.530  441800
...
2016-05-20 06:30:00   204.960 205.250 204.860 205.170  564441
2016-05-20 06:35:00   205.170 205.410 205.170 205.250  593626
2016-05-20 06:40:00   205.260 205.440 205.240 205.350  342840
...

我看到范围选择herehere的一些答案非常有用,但是没有显示在索引上设置多个并发约束 - 这将更具可读性。目前我正在通过缩写

来管理这个
(temp1 <- as.character(index(spy), format="%H:%M")) >= "06:30" & temp1 <= "06:50" -> set1
as.character(index(spy), format="%d") < "05" -> set2
then, spy[set1 & set2, ]

2 个答案:

答案 0 :(得分:2)

没有办法将两种功能结合起来。您可以做的一件事是使用split将数据分成每月块,然后使用first获取每月的前4个观察值。然后,您可以使用时间子集来获取特定的时间间隔。

require(xts)
times <- seq(as.POSIXct("2016-05-19 04:30:00"),
             as.POSIXct("2016-05-20 07:40:00"), by="5 min")
set.seed(21)
x <- xts(rnorm(length(times)), times)
# get the first 4 days' observations for each month
y <- do.call(rbind, lapply(split(x, "months"), first, n="4 days"))
# subset by time interval
y["T06:30:00/T06:50:00"]

答案 1 :(得分:1)

根据我以前的评论,您可以尝试以下方式:

=SUMIFS(Sheet4!C:C;Sheet4!A:A;B2;Sheet4!B:B;C2)

基本上我们只是按照我们想要的月/小时/分钟进行分组。