如何使用预定义级别切割两个 Posixct 序列

How to cut two Posixct sequences using predefined levels

我需要将两个 POSIXct 5 分钟序列聚合成 10 分钟序列。 为此,我想从两个 5 分钟的序列中创建一个 10 分钟的密钥,以便两者使用相同的级别。

我想知道是否有 R 方法可以做到这一点?

这是一个例子:

a = seq(as.POSIXct("2012-06-01 06:01"), by = "5 min", length.out = 24)
b = seq(as.POSIXct("2012-06-01 06:07"), by = "5 min", length.out = 24)

cut(a, "10 min")
cut(b, "10 min")

您会注意到 seq a 和 b 使用不同的级别

现在您可以采取一些技巧来解决这个问题,但这并不是很好

b_adjusted = b-min(abs(min(as.POSIXct(cut(a, "10 min")))-b))
cut(b_adjusted, "10 min")

keys = cut(c(a,b), "10 min")
a = keys[1:length(a)]
b = keys[(length(a)+1):(length(a)+length(b))]

这只是一个例子,我的实际案例涉及>10个序列。 理想情况下,我可以使用从第一轮 10 分钟级别开始的级别剪切,例如,如果我序列中的第一项是 00:17,那么生成的密钥是 00:10

也许可以组合所有向量,然后生成从 minmax 值的 10 分钟序列。

library(lubridate)

combined_seq <- c(a, b)
lvls <- seq(floor_date(min(combined_seq), '10 mins'),
              ceiling_date(max(combined_seq), '10 mins'), by = '10 mins')

然后您可以将此 lvls 用作 cut 中的关卡。

cut(a, levels)
cut(b, levels)

我们使用基数 R 形成一个输入列表,L,并从中计算一个向量列表 L10,如果我们使用题;然而,如果这不是一般情况,我们可以从中创建一组水平 levs,给出具有共同水平的因素列表 L10f

min10.POSIXct <- function(x) {  # returns POSIXct arg truncated to 10 min
  as.POSIXct(600 * floor(as.numeric(a) %/% 600), origin = "1970-01-01")
}
L <- list(a, b)
L10 <- lapply(L, min10.POSIXct)

# empty result shows they have same values
length(setdiff(L10[[1]], L10[[2]]))
## [1] 0

rng <- range(do.call("range", L10))
levs <- format(seq(rng[1], rng[2], "10 min"))

L10f <- lapply(L10, factor, levs)

更新

修改了几次