R 如何删除zoo格式中的特定时间段

R 如何删除zoo格式中的特定时间段,r,time-series,zoo,lubridate,R,Time Series,Zoo,Lubridate,我有一个zoo格式的时间序列数据和另一个POSIXct格式的2变量数据框,记录了7对开始和结束时间,代表应该删除的时间范围。下图以图形方式说明了这些问题。突出显示的区域是我已经确定的区域,预计将被删除 我知道窗口函数可以用来提取这些区域,但是有没有一种优雅的方法可以简单地删除这个区域中的数据 简单地说,有没有删除时间序列中几个周期的方法,比如使用减号删除数据框中的列或行 补充的 标识的周期位于数据帧中,如下所示,为POSIXct格式 时间序列数据采用标准zoo格式 简言之,没有 回想一下,POS

我有一个zoo格式的时间序列数据和另一个POSIXct格式的2变量数据框,记录了7对开始和结束时间,代表应该删除的时间范围。下图以图形方式说明了这些问题。突出显示的区域是我已经确定的区域,预计将被删除

我知道窗口函数可以用来提取这些区域,但是有没有一种优雅的方法可以简单地删除这个区域中的数据

简单地说,有没有删除时间序列中几个周期的方法,比如使用减号删除数据框中的列或行

补充的

标识的周期位于数据帧中,如下所示,为POSIXct格式

时间序列数据采用标准zoo格式

简言之,没有

回想一下,POSIXct确实将其信息存储为double。与我们对向量索引所做的类似,您希望使用的-运算符实际上是针对整数索引的,在整数索引中可以测试完全相等性

这里只有不等式。所以你们可能想要这样的东西,因为你们并没有提供任何可复制的东西,所以我在这里补充了日期:

R> set.seed(42)
R> N <- 1000
R> Z <- zoo( cumsum(rnorm(N)), order.by=Sys.time() + seq(0,by=3*60*60,length=N))
R> summary(Z)
     Index                              Z         
 Min.   :2016-09-19 06:36:25.31   Min.   :-49.91  
 1st Qu.:2016-10-20 11:51:25.31   1st Qu.:-27.43  
 Median :2016-11-20 16:06:25.31   Median :-10.71  
 Mean   :2016-11-20 16:06:25.31   Mean   :-15.89  
 3rd Qu.:2016-12-21 21:21:25.31   3rd Qu.: -6.30  
 Max.   :2017-01-22 02:36:25.31   Max.   :  9.06  
我们可以查看这些数据,并将看到它排除了我们预期的时间:

R> summary(newZ)
     Index                             newZ       
 Min.   :2016-09-19 06:36:25.31   Min.   :-49.91  
 1st Qu.:2016-10-12 23:06:25.31   1st Qu.:-33.73  
 Median :2016-12-05 17:36:25.31   Median :-12.65  
 Mean   :2016-11-22 03:49:42.16   Mean   :-17.74  
 3rd Qu.:2016-12-29 10:06:25.31   3rd Qu.: -5.56  
 Max.   :2017-01-22 02:36:25.31   Max.   :  9.06  
R> table( as.POSIXlt(index(newZ))$mon )   # no November as expected

  0   8   9  11 
169  94 248 248 
R> 
不过,您可能想看看索引。

简言之,没有

回想一下,POSIXct确实将其信息存储为double。与我们对向量索引所做的类似,您希望使用的-运算符实际上是针对整数索引的,在整数索引中可以测试完全相等性

这里只有不等式。所以你们可能想要这样的东西,因为你们并没有提供任何可复制的东西,所以我在这里补充了日期:

R> set.seed(42)
R> N <- 1000
R> Z <- zoo( cumsum(rnorm(N)), order.by=Sys.time() + seq(0,by=3*60*60,length=N))
R> summary(Z)
     Index                              Z         
 Min.   :2016-09-19 06:36:25.31   Min.   :-49.91  
 1st Qu.:2016-10-20 11:51:25.31   1st Qu.:-27.43  
 Median :2016-11-20 16:06:25.31   Median :-10.71  
 Mean   :2016-11-20 16:06:25.31   Mean   :-15.89  
 3rd Qu.:2016-12-21 21:21:25.31   3rd Qu.: -6.30  
 Max.   :2017-01-22 02:36:25.31   Max.   :  9.06  
我们可以查看这些数据,并将看到它排除了我们预期的时间:

R> summary(newZ)
     Index                             newZ       
 Min.   :2016-09-19 06:36:25.31   Min.   :-49.91  
 1st Qu.:2016-10-12 23:06:25.31   1st Qu.:-33.73  
 Median :2016-12-05 17:36:25.31   Median :-12.65  
 Mean   :2016-11-22 03:49:42.16   Mean   :-17.74  
 3rd Qu.:2016-12-29 10:06:25.31   3rd Qu.: -5.56  
 Max.   :2017-01-22 02:36:25.31   Max.   :  9.06  
R> table( as.POSIXlt(index(newZ))$mon )   # no November as expected

  0   8   9  11 
169  94 248 248 
R> 

不过,您可能需要查看索引。

如果已知子集的开始索引和结束索引,则可以对每个子集使用以下索引,假设x是zoo格式的数据:

x[start.index:end.index] <- NA
na.omit(x)
为了在zoo格式的数据中查找POSIXct时间的索引,可以使用以下方法:

x
2012-04-09 05:03:00 2012-04-09 05:04:00 2012-04-09 05:05:39 2012-04-09 05:09:00 2012-04-09 05:10:00 
                  2                   4                 3                   6                   1 

which(index(x) >= '2012-04-09 05:09:00' & index(x) <= '2012-04-09 05:10:00')
4 5

如果已知子集的开始索引和结束索引,则可以对每个子集使用以下索引,假设x是zoo格式的数据:

x[start.index:end.index] <- NA
na.omit(x)
为了在zoo格式的数据中查找POSIXct时间的索引,可以使用以下方法:

x
2012-04-09 05:03:00 2012-04-09 05:04:00 2012-04-09 05:05:39 2012-04-09 05:09:00 2012-04-09 05:10:00 
                  2                   4                 3                   6                   1 

which(index(x) >= '2012-04-09 05:09:00' & index(x) <= '2012-04-09 05:10:00')
4 5

受sandipan答案的启发,我写了一个小函数,如下所示,解决了这个问题。其中dat是zoo中的时间序列,hl.period是POSIXct格式的2变量数据帧,如问题所示。然而,我相信应该有一个更优雅的方法来解决这个问题

也感谢德克的贡献。你的方法看起来很有希望。但由于我是时间序列分析的新手,我需要做一些家庭作业来理解你的方法

del_periods<-function(dat,hl.period)
{
   for (i in 1:nrow(hl.period))
   {
       window(dat,start=hl.period[i,1],end=hl.period[i,2])<-NA
       dat<-na.omit(dat)
   }
  return(dat)
}

受sandipan答案的启发,我写了一个小函数,如下所示,解决了这个问题。其中dat是zoo中的时间序列,hl.period是POSIXct格式的2变量数据帧,如问题所示。然而,我相信应该有一个更优雅的方法来解决这个问题

也感谢德克的贡献。你的方法看起来很有希望。但由于我是时间序列分析的新手,我需要做一些家庭作业来理解你的方法

del_periods<-function(dat,hl.period)
{
   for (i in 1:nrow(hl.period))
   {
       window(dat,start=hl.period[i,1],end=hl.period[i,2])<-NA
       dat<-na.omit(dat)
   }
  return(dat)
}

这里有两个可能的单行线。也许没有期望的那么简单,但它们很短,第二个使用减号

1 findInterval zoo索引可以是逻辑的,因此此代码使用findInterval的逻辑条件工作,其中z是输入POSIXct zoo系列,st是开始的POSIXct向量,en是结束的相应POSIXct向量。下面的代码形成cst[1]、en[1]+.001、st[2]、en[2]+.001、。。。因此偶数间隔表示要保留的范围,奇数间隔表示要排除的范围。这确实假设区间是有序且不重叠的,因此st[1]
z[ findInterval(index(z), c(rbind(st, en + .001))) %% 2 == 0 ]
注意,如果st和en的长度均为1,则简化为:

z[ findInterval(index(z), c(st, en + .001)) != 1 ]
2匹配如果st和en值在indexz值之间,我们可以交替使用匹配。例如,如果z是小时序列,则问题中显示的开始和结束就是这种情况。这利用了z[-3:4]可以从zoo系列z中排除元素3和4这一事实。下面的代码将POSIXct值转换为1、2、3、…、lengthz之间的索引,并使用减号排除

z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
请注意,如果st和en的长度均为1,则简化为:

z[ - seq(match(st, index(z)), match(en, index(z)) ]
示例2

例如,使用以下输入进行尝试:

library(zoo)

tt <- seq(as.POSIXct("2011-01-01 00:00:00"), as.POSIXct("2011-01-04 23:00:00"), by="hour")
z <- zoo(seq_along(tt), tt)

st <- as.POSIXct(c("2011-01-02 13:00:00", "2011-01-04 15:00:00"))
en <- as.POSIXct(c("2011-01-02 14:00:00", "2011-01-04 17:00:00"))
现在我们可以运行这个了

z0 <- z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
plot(z0, type = "p", pch = 20)
请注意下图中排除的两个区域


这里有两个可能的单行线。也许没有期望的那么简单,但它们很短,第二个使用减号

1 findInterval动物园索引c 一个是逻辑的,所以这个代码使用findInterval的逻辑条件工作,其中z是输入POSIXct zoo系列,st是开始的POSIXct向量,en是相应的结束的POSIXct向量。下面的代码形成cst[1]、en[1]+.001、st[2]、en[2]+.001、。。。因此偶数间隔表示要保留的范围,奇数间隔表示要排除的范围。这确实假设区间是有序且不重叠的,因此st[1]
z[ findInterval(index(z), c(rbind(st, en + .001))) %% 2 == 0 ]
注意,如果st和en的长度均为1,则简化为:

z[ findInterval(index(z), c(st, en + .001)) != 1 ]
2匹配如果st和en值在indexz值之间,我们可以交替使用匹配。例如,如果z是小时序列,则问题中显示的开始和结束就是这种情况。这利用了z[-3:4]可以从zoo系列z中排除元素3和4这一事实。下面的代码将POSIXct值转换为1、2、3、…、lengthz之间的索引,并使用减号排除

z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
请注意,如果st和en的长度均为1,则简化为:

z[ - seq(match(st, index(z)), match(en, index(z)) ]
示例2

例如,使用以下输入进行尝试:

library(zoo)

tt <- seq(as.POSIXct("2011-01-01 00:00:00"), as.POSIXct("2011-01-04 23:00:00"), by="hour")
z <- zoo(seq_along(tt), tt)

st <- as.POSIXct(c("2011-01-02 13:00:00", "2011-01-04 15:00:00"))
en <- as.POSIXct(c("2011-01-02 14:00:00", "2011-01-04 17:00:00"))
现在我们可以运行这个了

z0 <- z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]
plot(z0, type = "p", pch = 20)
请注意下图中排除的两个区域


能否提供一个模拟数据的小示例?有关如何提供可复制的示例,请参阅。在本例中,我在回答中提供了一个示例。非常感谢@G.Grothendieck,我将在以后查看并按照说明进行操作。您能否提供一个模拟数据的小示例?有关如何提供可复制的示例,请参阅。在本例中,我在回答中提供了一个。非常感谢@G.Grothendieck,我将在将来查看并遵循说明。