使用 POSIXct 索引更改 xts 对象的特定时间

change specific hours of xts object with POSIXct index

我有一个看起来像这样的数据框

df = data.frame (time = c("2013-12-23 00:00:00", "2013-12-23 00:13:00", "2013-12-23 00:14:00", "2013-12-23 00:14:01",
                          "2013-12-24 00:00:00", "2013-12-24 00:12:00", "2013-12-24 00:15:00", "2013-12-24 00:16:00"),
                 value = c(1, 2, 3, 4, 5, 6, 7, 8))

我将此数据框转换为 xts 对象并使用 POSIXct 格式作为索引

df = as.xts(as.numeric(as.character(df[,"value"])), order.by = as.POSIXct(df[,"time"]))

我现在需要的是将时间为00:00:00的索引全部改成22:00:00。 所有其他时间索引必须保持原样。

生成的对象如下所示

>df
[,1]
2013-12-23 00:13:00    2
2013-12-23 00:14:00    3
2013-12-23 00:14:01    4
2013-12-23 22:00:00    1
2013-12-24 00:12:00    6
2013-12-24 00:15:00    7
2013-12-24 00:16:00    8
2013-12-24 22:00:00    5

感谢您的帮助!帕特

我们可以使用sub将原始数据集中的'00:00:00'替换为'22:00:00',然后进行xts转换

df$time <- as.POSIXct(sub('00:00:00', '22:00:00', df$time), 
                 format='%Y-%m-%d %H:%M:%S')
library(xts)
xts(df$value, order.by=df$time)
#                    [,1]
#2013-12-23 00:13:00    2
#2013-12-23 00:14:00    3
#2013-12-23 00:14:01    4
#2013-12-23 22:00:00    1
#2013-12-24 00:12:00    6
#2013-12-24 00:15:00    7
#2013-12-24 00:16:00    8
#2013-12-24 22:00:00    5

这是一个将 xts 对象的零时移动 n 秒的函数。

shiftZeroHour <- function(x, n=1) {
  stopifnot(is.xts(x))
  # find zero hour
  plt <- as.POSIXlt(index(x), tz=indexTZ(x))
  isZeroHour <- plt$hour == 0 & plt$min == 0 & plt$sec == 0
  # shift zero hour index values
  .index(x)[isZeroHour] <- .index(x)[isZeroHour] + n
  # ensure index is ordered properly
  as.xts(x)
}

以下是如何将它与示例数据一起使用:

xdf <- structure(c(1, 2, 3, 4, 5, 6, 7, 8), .Dim = c(8L, 1L),
  index = structure(c(1387778400, 1387779180, 1387779240, 1387779241,
  1387864800, 1387865520, 1387865700, 1387865760), tzone = "",
  tclass = c("POSIXct", "POSIXt")), class = c("xts", "zoo"),
  .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"),
  .indexTZ = "", tzone = "")
shiftZeroHour(xdf, 60*60*22)