在R中使用XTS在聚合后编辑索引

在R中使用XTS在聚合后编辑索引,r,time-series,aggregation,xts,R,Time Series,Aggregation,Xts,我使用xts包在R中创建了一个样本时间序列。我创建了一系列日期,以分钟分隔,为每个日期创建了样本数据,然后最终按小时进行聚合,将数据相加。这是可行的,除了一个问题 一旦我完成了聚合,索引就不会显示每个小时的数据,而是显示第59分钟的数据。我需要在合并关注点的时间显示索引。下面是我的代码: #xts simple example code BD <- chron("01/01/2015", "00:00:00") # Setting begin date. ED <- chron("

我使用xts包在R中创建了一个样本时间序列。我创建了一系列日期,以分钟分隔,为每个日期创建了样本数据,然后最终按小时进行聚合,将数据相加。这是可行的,除了一个问题

一旦我完成了聚合,索引就不会显示每个小时的数据,而是显示第59分钟的数据。我需要在合并关注点的时间显示索引。下面是我的代码:

#xts simple example code

BD <- chron("01/01/2015", "00:00:00") # Setting begin date.
ED <- chron("02/01/2015", "23:59:00") # Setting end date.
DS <- seq(BD, ED, by = times("00:01:00")) # Creating a sequence of dates seperated by a minute.

data <- runif(length(DS), 0, 100) # Generating random numerical data the length of the date sequence.

x <- xts(data, DS) # Creates an xts object indexed by the dates of "DS" with data from "data".
colnames(x) <- "Data" # Just renaiming the data column in the xts object.

x.agg <- period.apply(x, endpoints(x, "hours"), sum) # Aggregating by hour
#xts简单示例代码

BD你要求做的事可能非常危险。您说过要将聚合数据与小时开始对齐,以便可以将其与其他序列合并。你可以通过改变观察时间戳来引入偏差

索引确实显示了每个小时的数据。请注意,您使用了一个名为
endpoints
的函数,因此小时数据位于每个小时的末尾。如果要在一小时开始时进行聚合,请使用。在这种情况下,答案中的函数似乎有一个微妙的缺陷。这是一个修补版本:

startpoints <- function (x, on = "months", k = 1) {
  c(0, head(endpoints(x, on, k)[-1] + 1, -1))
}

另一种可能的解决方案是对
期间的输出使用
align.time
。应用使用
端点的
调用<代码>对齐。时间(x,3600)
将索引四舍五入到下一个小时

head(x.agg <- align.time(period.apply(x, endpoints(x, "hours"), sum), 3600))
(01/01/15 07:00:00) 3236.172
(01/01/15 08:00:00) 2893.148
(01/01/15 09:00:00) 3100.842
(01/01/15 10:00:00) 2996.260
(01/01/15 11:00:00) 3088.869
(01/01/15 12:00:00) 3353.841

head(x.agg您要求执行的操作可能非常危险。您说过要将聚合数据与小时开始对齐,以便可以将其与其他序列合并。您可能通过更改观察时间戳引入偏差

索引确实显示了小时的每个数据。请注意,您使用了一个名为
endpoints
的函数,因此小时的数据位于每个小时的末尾。如果要在小时开始时进行聚合,请使用。在这种情况下,该答案中的函数似乎有一个细微的错误。下面是一个修补版本:

startpoints <- function (x, on = "months", k = 1) {
  c(0, head(endpoints(x, on, k)[-1] + 1, -1))
}

另一种可能的解决方案是对
时段的输出使用
align.time
。使用
端点的调用应用
align.time
。time(x,3600)
将索引四舍五入到下一个小时

head(x.agg <- align.time(period.apply(x, endpoints(x, "hours"), sum), 3600))
(01/01/15 07:00:00) 3236.172
(01/01/15 08:00:00) 2893.148
(01/01/15 09:00:00) 3100.842
(01/01/15 10:00:00) 2996.260
(01/01/15 11:00:00) 3088.869
(01/01/15 12:00:00) 3353.841

head(x.agg)这与我最终想要的非常接近。但是,我运行它时替换了提供的startpoints函数,唯一的问题是第一个聚合日期表示为:“01/01/15 01:00:00”,而我希望它表示为:“01/01/15 00:00”这意味着这是所有日期在该小时内的数据点的集合。我尝试用-59代替+1,但在数据末尾产生了同样的问题。可能我误解了端点如何解析“小时”。@giraffhere:使用我链接的问题中的
startpoints
函数(不是我的“补丁”版本),然后将调用更改为:
period.apply(x,c(0,startpoints(x,“hours”)),sum)
。出于某种奇怪的原因,时间“01/01/15 00:00:00:00”的聚合仍然只是将“01/01/15 00:00:00”的分钟数计入总和(因此这是一个非常小的数字),其余的时间似乎进入了“01/01/15 01:00:00”一个小时(大得多),所以我一定是误解了什么。但无论如何,你在这方面帮了我很大的忙,我不想再占用你的时间了。我相信我会在适当的时候找到解决办法或其他办法。非常感谢你!)@长颈鹿:我想你误解的是你所要求的可能非常危险,所以我没有告诉你怎么做。你要求的是“聚合”通过创建一个数据结构来创建时间序列数据,该数据结构在每个时间戳都包含来自未来的数据。有关另一个可能的解决方案,请参阅我的编辑。虽然我确实看到了您的观点,但我很难理解为什么要在时间之间(包括时间)进行聚合(例如)00:00:00和00:59:00,将聚合表示为00:00:00的小时是非常糟糕的。正如您所说,我确实希望时间戳表示未来的数据,如:“这是00:00:00小时内发生的数据点的聚合”。
period.apply(x,端点(x,“小时”),sum)
确实提供了我想要的聚合,但没有正确的时间戳。这与我最终想要的非常接近。但是,我在运行时替换了提供的startpoints函数,唯一的问题是第一个聚合日期表示为:“01/01/15 01:00:00”,而我希望它表示为:“01/01/15 00:00:00”意味着这是所有日期在该小时内的数据点的聚合。我尝试用-59代替+1,但在数据末尾产生了相同的问题。可能我误解了端点如何解析“小时”“@giraffhere:使用我链接到的问题中的
startpoints
函数(不是我的“补丁”版本),然后将调用更改为:
period.apply(x,c(0,startpoints(x,“hours”)),sum)
。出于某种奇怪的原因,“01/15 00:00:00”时间的聚合仍然只是将“01/01/15 00:00:00”的分钟数计入总和(因此这是一个非常小的数量),其余的似乎将进入“01/01/15 01:00:00”小时(更大的数量),所以一定有什么我误解了。但不管怎样,你在这方面帮了我很大的忙,我不想再占用你的时间了。我相信我会在适当的时候找出答案或找到替代方案。非常感谢!)@长颈鹿:我想你误解的是你所要求的可能非常危险,所以我没有告诉你怎么做。你要求的是“聚合”通过创建一个数据结构来创建时间序列数据,该数据结构在每个时间戳都包含来自未来的数据。有关另一个可能的解决方案,请参阅我的编辑。虽然我确实看到了您的观点,但我很难理解为什么要在时间(包括时间)之间进行聚合
head(x.agg <- align.time(period.apply(x, endpoints(x, "hours"), sum), 3600))
(01/01/15 07:00:00) 3236.172
(01/01/15 08:00:00) 2893.148
(01/01/15 09:00:00) 3100.842
(01/01/15 10:00:00) 2996.260
(01/01/15 11:00:00) 3088.869
(01/01/15 12:00:00) 3353.841