R_基于小时数提取时间序列

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

我有一个长时间序列“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 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)]