【问题标题】:Subset time series by groups based on cutoff date data frame根据截止日期数据框按组划分时间序列
【发布时间】:2017-02-21 15:15:51
【问题描述】:

我有一个数据框,其中包含几个不同组的时间序列数据。我想对原始数据框中的每个组应用不同的开始和结束截止日期。

这是一个示例数据框:

date <- seq(as.POSIXct("2014-07-21 17:00:00", tz= "GMT"), as.POSIXct("2014-09-11 24:00:00", tz= "GMT"), by="hour") 
group <- letters[1:4]                           
datereps <- rep(date, length(group))                  
attr(datereps, "tzone") <- "GMT"
sitereps <- rep(group, each = length(date))    
value  <- rnorm(length(datereps))
df <- data.frame(DateTime = datereps, Group = group, Value = value)  

这是要使用的截止日期的数据框“cut”:

start <- c("2014-08-01 00:00:00 GMT", "2014-07-26 00:00:00 GMT", "2014-07-21 17:00:00 GMT", "2014-08-03 24:00:00 GMT")
end <- c("2014-09-11 24:00:00 GMT", "2014-09-01 24:00:00 GMT", "2014-09-07 24:00:00 GMT", "2014-09-11 24:00:00 GMT")
cut <- data.frame(Group = group, Start = as.POSIXct(start), End = as.POSIXct(end))

我可以为每个组手动执行此操作,使用![(),] 在时间序列的两端删除我不想要的数据:

df2 <- df[!(df$Group == "a" & df$DateTime > "2014-08-01 00:00:00 GMT" & df$DateTime < "2014-09-11 24:00:00 GMT"),]

但是,我该如何自动化呢?

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    只需将剪切合并到数据框中,然后使用新列创建一个新数据框,如下所示。 df3 包含删除的记录,df4 包含保留的记录。

    df2 <- merge(x = df,y = cut,by = "Group")
    df3 <- df2[df2$DateTime <= df2$Start | df2$DateTime >= df2$End,]
    df4 <- df2[!(df2$DateTime <= df2$Start | df2$DateTime >= df2$End),]
    

    【讨论】:

    • 好的,如果你想做类似的事情怎么办,但这次不是删除数据,而是标记特定日期时间范围内的行(再次由开始和结束日期)?我在这里问了一个新问题Create column to flag rows within a date period in R
    • @notacodr 在该代码中,我们使用真假语句向量对数据框进行子集化。因此,如果您只想创建一个标志,当某物在范围内时为 TRUE,否则为 FALSE,您可以这样做:df2$flagvar &lt;- !(df2$DateTime &lt;= df2$Start | df2$DateTime &gt;= df2$End)
    • 是的,我喜欢。谢谢!
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2019-01-15
    • 2017-10-17
    • 2023-03-08
    • 2022-11-14
    • 1970-01-01
    • 2020-11-02
    • 2021-09-16
    相关资源
    最近更新 更多