R_基于小时数提取时间序列
我有一个长时间序列“obs”,带有1小时的时间步长(class=“zoo”)。有一些缺失的值已被删除,因此时间步长不再一致R_基于小时数提取时间序列,r,time-series,R,Time Series,我有一个长时间序列“obs”,带有1小时的时间步长(class=“zoo”)。有一些缺失的值已被删除,因此时间步长不再一致 > head(obs) time obs 2009-12-22 01:00:00 23.708 2009-12-22 02:00:00 23.708 2009-12-22 03:00:00 23.708 2009-12-22 04:00:00 23.708 2009-12-22 06:00:00 23.708 2009-12-22
> head(obs)
time obs
2009-12-22 01:00:00 23.708
2009-12-22 02:00:00 23.708
2009-12-22 03:00:00 23.708
2009-12-22 04:00:00 23.708
2009-12-22 06:00:00 23.708
2009-12-22 07:00:00 23.708
> tail(obs)
time obs
2013-09-22 21:00:00 45.031
2013-09-22 22:00:00 45.031
2013-09-22 23:00:00 41.589
2013-09-23 00:00:00 28.987
2013-09-23 01:00:00 22.238
2013-09-23 02:00:00 20.533
现在,根据这个时间序列,我想创建多个时间序列,从每个小时开始,时间步长为12小时。所以总共应该有12个时间序列。下面给出了一个预期输出(从01:00:00开始)
像这样,我需要创建其他时间序列(从02:00:00、03:00:00等开始),时间步长为12小时。如果时间步长是一致的,我可以每12小时转换一行数据,然后从每列中提取数据就容易多了。但现在不可能了。我怎么做?我已经在使用xts软件包了。但是我找不到办法 xts是正确的软件包。您感兴趣的是函数 [.xts(提取xts对象的子集) 例如:
obs["T01:00/T01:59"]
将返回“T”时间介于01:00和01:59之间的所有观测值
你只需要矢量化,把它们放在一起,你可以得到类似的结果:
my_func <- function(i, obs){
if(i > 9){
hours <- paste("T", i, ":00/T", i, ":59", sep = "")
}else{
hours <- paste("T0", i, ":00/T0", i, ":59", sep = "")
}
hours.12 <- paste("T", i + 12, ":00/T", i + 12, ":59", sep = "")
#
obs.subset <- rbind(obs[hours], obs[hours.12])
}
# get a list of 12 subsets as requested
obs.subsetted <- lapply(0:11, my_func, obs)
my_func 9){
小时数xts是正确的软件包。您感兴趣的是函数
[.xts(提取xts对象的子集)
例如:
obs["T01:00/T01:59"]
将返回“T”时间介于01:00和01:59之间的所有观测值
你只需要矢量化,把它们放在一起,你可以得到类似的结果:
my_func <- function(i, obs){
if(i > 9){
hours <- paste("T", i, ":00/T", i, ":59", sep = "")
}else{
hours <- paste("T0", i, ":00/T0", i, ":59", sep = "")
}
hours.12 <- paste("T", i + 12, ":00/T", i + 12, ":59", sep = "")
#
obs.subset <- rbind(obs[hours], obs[hours.12])
}
# get a list of 12 subsets as requested
obs.subsetted <- lapply(0:11, my_func, obs)
my_func 9){
小时数xts是正确的软件包。您感兴趣的是函数
[.xts(提取xts对象的子集)
例如:
obs["T01:00/T01:59"]
将返回“T”时间介于01:00和01:59之间的所有观测值
你只需要矢量化,把它们放在一起,你可以得到类似的结果:
my_func <- function(i, obs){
if(i > 9){
hours <- paste("T", i, ":00/T", i, ":59", sep = "")
}else{
hours <- paste("T0", i, ":00/T0", i, ":59", sep = "")
}
hours.12 <- paste("T", i + 12, ":00/T", i + 12, ":59", sep = "")
#
obs.subset <- rbind(obs[hours], obs[hours.12])
}
# get a list of 12 subsets as requested
obs.subsetted <- lapply(0:11, my_func, obs)
my_func 9){
小时数xts是正确的软件包。您感兴趣的是函数
[.xts(提取xts对象的子集)
例如:
obs["T01:00/T01:59"]
将返回“T”时间介于01:00和01:59之间的所有观测值
你只需要矢量化,把它们放在一起,你可以得到类似的结果:
my_func <- function(i, obs){
if(i > 9){
hours <- paste("T", i, ":00/T", i, ":59", sep = "")
}else{
hours <- paste("T0", i, ":00/T0", i, ":59", sep = "")
}
hours.12 <- paste("T", i + 12, ":00/T", i + 12, ":59", sep = "")
#
obs.subset <- rbind(obs[hours], obs[hours.12])
}
# get a list of 12 subsets as requested
obs.subsetted <- lapply(0:11, my_func, obs)
my_func 9){
小时数这是一个使用数据的解决方案。表
和润滑油
在我的笔记本电脑上,整个代码片段只需不到0.01秒
# Load packages
library(lubridate)
library(data.table)
# Set up data
time <- seq(ymd_hms("2009-12-22 01:00:00"), ymd_hms("2013-09-23 02:00:00"), by="1 hour")
obs <- abs(rnorm(length(time)))
dt <- data.table(time, obs)
# Set up a list where all 12 output data tables are stored
l <- vector(12, mode="list")
# Split original data
for (i in 0:11){
l[[i+1]] <- dt[seq(from=i+1, to=nrow(dt), by=12)]
}
下面是一个使用data.table
和lubridate
的解决方案
在我的笔记本电脑上,整个代码片段只需不到0.01秒
# Load packages
library(lubridate)
library(data.table)
# Set up data
time <- seq(ymd_hms("2009-12-22 01:00:00"), ymd_hms("2013-09-23 02:00:00"), by="1 hour")
obs <- abs(rnorm(length(time)))
dt <- data.table(time, obs)
# Set up a list where all 12 output data tables are stored
l <- vector(12, mode="list")
# Split original data
for (i in 0:11){
l[[i+1]] <- dt[seq(from=i+1, to=nrow(dt), by=12)]
}
下面是一个使用data.table
和lubridate
的解决方案
在我的笔记本电脑上,整个代码片段只需不到0.01秒
# Load packages
library(lubridate)
library(data.table)
# Set up data
time <- seq(ymd_hms("2009-12-22 01:00:00"), ymd_hms("2013-09-23 02:00:00"), by="1 hour")
obs <- abs(rnorm(length(time)))
dt <- data.table(time, obs)
# Set up a list where all 12 output data tables are stored
l <- vector(12, mode="list")
# Split original data
for (i in 0:11){
l[[i+1]] <- dt[seq(from=i+1, to=nrow(dt), by=12)]
}
下面是一个使用data.table
和lubridate
的解决方案
在我的笔记本电脑上,整个代码片段只需不到0.01秒
# Load packages
library(lubridate)
library(data.table)
# Set up data
time <- seq(ymd_hms("2009-12-22 01:00:00"), ymd_hms("2013-09-23 02:00:00"), by="1 hour")
obs <- abs(rnorm(length(time)))
dt <- data.table(time, obs)
# Set up a list where all 12 output data tables are stored
l <- vector(12, mode="list")
# Split original data
for (i in 0:11){
l[[i+1]] <- dt[seq(from=i+1, to=nrow(dt), by=12)]
}
在搜索了这么长时间后,我从xts
包中找到了这个直接的方法
obs[.indexhour(x) %in% c(t1,t2)]
这提取了每天t1
和t2
小时的所有观察值。要了解更多详细信息,请在xts
package中尝试?indexClass
,在搜索了这么长时间后,我从xts
package中找到了这个直接的方法
obs[.indexhour(x) %in% c(t1,t2)]
这提取了每天t1
和t2
小时的所有观察值。要了解更多详细信息,请在xts
package中尝试?indexClass
,在搜索了这么长时间后,我从xts
package中找到了这个直接的方法
obs[.indexhour(x) %in% c(t1,t2)]
这提取了每天t1
和t2
小时的所有观察值。要了解更多详细信息,请在xts
package中尝试?indexClass
,在搜索了这么长时间后,我从xts
package中找到了这个直接的方法
obs[.indexhour(x) %in% c(t1,t2)]
这提取了每天t1
和t2
小时的所有观察结果。有关更多详细信息,请尝试xts
软件包中的?indexClass
。是否有任何答案对您有帮助?是否有任何答案对您有帮助?是否有任何答案对您有帮助?谢谢@majom。只有在时间步长为一致。但正如我已经提到的,由于缺少数据,时间步长不一致。否则,我可以将12小时的数据转换为行,然后从每个列中提取。感谢@majom。这只在时间步长一致时有效。但正如我已经提到的,时间步长不一致,因为缺少数据g数据。否则,我可以将12小时数据转换为行,然后从每列中提取。感谢@majom。这仅在时间步长一致时有效。但正如我前面提到的,时间步长不一致,因为缺少数据。否则,我可以将12小时数据转换为行,然后提取from每列。谢谢@majom。这只在时间步长一致的情况下有效。但是正如我已经提到的,由于缺少数据,时间步长不一致。否则我可以将12小时的数据转换成行,然后从每列中提取。谢谢@luis_js。这也解决了问题。但是请检查我的答案ch更直截了当。谢谢@luis_js。这也解决了问题。但是请检查我的答案哪个更直截了当。谢谢@luis_js。这也解决了问题。但是请检查我的答案哪个更直截了当。谢谢@luis_js。这也解决了问题。但是请检查我的答案哪个更直截了当。
obs[.indexhour(x) %in% c(t1,t2)]