如何删除动物园格式的特定时间段

时间:2016-09-19 11:20:23

标签: r time-series zoo lubridate

我有zoo格式的时间序列数据和POSIXct格式的另外2个变量数据帧记录了7对凝视和结束时间,它们代表了应该删除的时间范围。下图以图形方式说明了问题。突出显示的区域是我已经识别的区域,预计将被删除。

我知道window函数可用于提取这些区域,但是有一种优雅的方法可以简单地删除此区域中的数据吗?

简单来说,任何方法都可以删除时间序列中的几个句点,比如使用减号( - )来删除数据框中的列或行?

Illustration

补充

标识的时间段位于数据框中,如下所示(POSIXct格式)

时间序列数据采用标准动物园格式

enter image description here

4 个答案:

答案 0 :(得分:3)

简而言之,没有。

回想一下,POSIXct确实将其信息存储为double。您对-运算符的期望使用,类似于我们对vector indices 所做的操作,其目标实际上是整数索引,可以测试完全相等。

这里你只有不平等。所以你可能想要这样的东西(我在那里编造日期,因为你没有提供任何可重复的东西):

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  

现在我们有了一些数据,让我们只使用索引逻辑来排除给定的时间段 - 我们通过ISOdatetime划分:

R> newZ <- Z[ ! (index(Z) >= ISOdatetime(2016,11,1,0,0,0) \
               & index(Z) <= ISOdatetime(2016,11,30,23,59,59)), ]
R>

我们可以查看数据,并会看到它排除了我们的目标所需的期限:

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> 

您可能希望查看xts索引。

答案 1 :(得分:2)

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

    CSS INDEX
    ===================
	
    1. Theme Default CSS (body, link color, section etc)
    2. Header Area
    3. Slider Area
    4. Feature Area
    5. Service Area
    6. Video Area
    7. Features Carousel Area
    8. Pricing Area
    9. Clients Area
    10. Blog Area
    11. Download Area
    12. Contact Area
    13. Footer Area
    14. Image, Solid, Gradient, Transparent, Video Background Area
    15. Light Section Style
    16. Layout Two Style
    17. Scroll Up Start
-----------------------------------------------------------------------------------*/

/*----------------------------------------*/
/*  1. Theme default CSS
/*----------------------------------------*/
* { margin:0; padding:0; }
html, body {height: 100%;}
.floatleft {float:left !important;}
.floatright {float:right !important;}
.floatnone {float:none !important;}
.alignleft {text-align:left !important;}
.alignright {text-align:right !important;}
.aligncenter {text-align:center !important;}
.no-display { display:none; }
.no-margin { margin:0 !important; }
.no-padding { padding:0 !important; }
a:focus, button:focus {outline:0px solid}
img {
    max-width:100%;
    height:auto;
    border:0; 
    vertical-align:top;
}
.fix {overflow:hidden}
p {
    font-family: "Neuton",serif;
    font-weight: 300;
    line-height: 24px;
    margin: 0 0 15px;
}
h1, h2, h3, h4, h5, h6 {
    margin: 0 0 10px;
}
a {transition: all 0.3s ease 0s;text-decoration:none;}
a:hover {
    color: #fff;
    text-decoration: none;
}
a:active, a:hover, a:focus {
  outline: 0 none;
    text-decoration: none
}
ul{
    list-style: outside none none;
    margin: 0;
    padding: 0
}
.clear{clear:both}
::-moz-selection {
    background: #b3d4fc;
    text-shadow: none;
}
.browserupgrade {
    margin: 0.2em 0;
    background: #ccc;
    color: #000;
    padding: 0.2em 0;
}
::selection {
    background: #b3d4fc;
    text-shadow: none;
}
body {
  color: #D0D0D0;
  font-family: "montserratregular";
  font-size: 16px;
  line-height: 20px;
  text-align: left;
}
#header {
	width:100%;
	height:100px;
	border:1px solid #000;
}
#logo{
	clear:both;
	margin:20px;
}
#logo a {
    display: block;
    margin-left: -18px;
    position: relative;
}

为了在动物园格式的数据中找到POSIXct时间的索引,您可以使用以下内容:

<!DOCTYPE html>
<!--[if IE 8 ]><html class="ie" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"><!--<![endif]-->
<head>
    <!-- Basic Page Needs -->
    <meta charset="utf-8">
    <!--[if IE]><meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'><![endif]-->
    <title>Security Simplified</title>
	
	<!-- Bootstrap  -->
    <link rel="stylesheet" type="text/css" href="CSS/bootstrap.css" >

    <!-- Theme Style -->
    <link rel="stylesheet" type="text/css" href="CSS/style.css">
	
</head>
<body class="no-transition stretched">

<div id="wrapper" class="clearfix">
<header id="header" class="full-header">

					<!-- Logo-->
					<div id="logo">
						<a href="index.html" class="standard-logo"><img src="images/logo.png" alt=" Logo"></a>
					</div><!-- #logo end -->
</header>			

<div id='quiz'></div>
            <div class='button' id='next'><a href='#'>Next</a></div>
            <div class='button' id='prev'><a href='#'>Prev</a></div>
            <!-- <button class='' id='next'>Next</a></button>
                <button class='' id='prev'>Prev</a></button>
                <button class='' id='start'> Start Over</a></button> -->
        </div>
        <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>

</div> <!-- end of wrapper -->

答案 2 :(得分:0)

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

还要感谢Dirk的贡献。你的方法很有前景。但由于我是时间序列分析的新手,我需要做一些功课来理解你的方法。

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)
}

答案 3 :(得分:0)

这是两个可能的单行。也许不是那么简单,但它们很短,第二个确实使用减去。

1)findInterval 动物园索引可以是合乎逻辑的,因此此代码使用findInterval的逻辑条件,其中z是输入POSIXct动物园系列。st是开始的POSIXct向量,en是对应的POSIXct向量向量。下面的代码形成c(st[1], en[1] + .001, st[2], en[2] + .001, ...),以便偶数编号的区间表示要保留的范围和要排除的奇数。这确实假设间隔是有序的并且是不重叠的,因此st[1] < en[1] < st[2] < en[2] < ...在问题中似乎就是这种情况。

z[ findInterval(index(z), c(rbind(st, en + .001))) %% 2 == 0 ]

请注意,如果sten的长度均为1,则会将其简化为:

z[ findInterval(index(z), c(st, en + .001)) != 1 ]

2)匹配如果sten值属于index(z)值,我们可以使用match。例如,如果z是小时系列,问题中显示的开头和结尾就是这种情况。这利用了z[-(3:4)]从动物园系列z中排除元素3和4的事实。下面的代码将POSIXct值转换为1,2,3,...,length(z)之间的索引,并使用减号进行排除。

z[ - unlist(Map(seq, match(st, index(z)), match(en, index(z)))) ]

请注意,如果sten的长度均为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)

请注意下图中的两个排除区域。

screenshot