【问题标题】:R - Filtering time seriesR - 过滤时间序列
【发布时间】:2012-08-21 16:20:23
【问题描述】:

我有一个时间序列

mainTimeSeries <- data.frame(time=seq(as.POSIXct("2012/1/1"), as.POSIXct("2012/1/5"), "hour"), value=sample(1:10, 1))

我想过滤掉另一个系列中存在的所有数据

badTimeSeries<-data.frame(startTime=seq(as.POSIXct("2012/1/3"), as.POSIXct("2012/1/4"), "hour"))
badTimeSeries$endTime <- badTimeSeries$startTime + 1800

是否存在过滤日期的现有功能?结果应该是 mainTimeSeries 的任何元素都不应该介于 badTimeSeries 的 startTime 和 endTime 之间。

【问题讨论】:

  • 检查您的数据。您提供的内容没有 endTime 列。此外,mainTimeSeries 只是时间的向量。你的意思是它是某种时间序列对象吗?
  • @GSee 感谢您的指出。已修改。

标签: r time-series


【解决方案1】:

lubridate 在这里很有用。没有它,您需要编写自己的重叠检查,这有点痛苦......

library(lubridate)

badRange <- as.interval(days(1), as.POSIXct("2012/1/3"))

> mainTimeSeries %within% badRange
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[22] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[43] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[64]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> 

或者:

> mainTimeSeries[mainTimeSeries %within% badRange]
 [1] "2012-01-03 00:00:00 PST" "2012-01-03 01:00:00 PST" "2012-01-03 02:00:00 PST" "2012-01-03 03:00:00 PST"
 [5] "2012-01-03 04:00:00 PST" "2012-01-03 05:00:00 PST" "2012-01-03 06:00:00 PST" "2012-01-03 07:00:00 PST"
 [9] "2012-01-03 08:00:00 PST" "2012-01-03 09:00:00 PST" "2012-01-03 10:00:00 PST" "2012-01-03 11:00:00 PST"
[13] "2012-01-03 12:00:00 PST" "2012-01-03 13:00:00 PST" "2012-01-03 14:00:00 PST" "2012-01-03 15:00:00 PST"
[17] "2012-01-03 16:00:00 PST" "2012-01-03 17:00:00 PST" "2012-01-03 18:00:00 PST" "2012-01-03 19:00:00 PST"
[21] "2012-01-03 20:00:00 PST" "2012-01-03 21:00:00 PST" "2012-01-03 22:00:00 PST" "2012-01-03 23:00:00 PST"
[25] "2012-01-04 00:00:00 PST"
> 

仅使用基础 R:

bad_start <- as.POSIXct('2012/1/3')
bad_end   <- as.POSIXct('2012/1/4')
mainTimeSeries[mainTimeSeries > bad_end | mainTimeSeries < bad_start]

【讨论】:

  • 我现在正在添加一个基本的 R 解决方案。
  • @Justin "Using only base R" 解决方案您只使用了一个 bad_start 和 bad_end 日期,但我上面的问题有一系列 bad_start 和 bad_end 日期。
  • @2sb 您的问题有一系列startTimes。我使用了从min(badTimeseries$startTime)max(badTimeseries$startTime) 的范围。如果任何 mainTimeSeries 值介于两者之间,则其下降。同mainTimeSeries[!mainTimeSeries %in% badTimeSeries$startTime]
  • @Justin 对不起,如果我没有把问题说清楚,但你不能接受 min() 和 max()。 badTimeSeries 的每一行都有一个糟糕的时间范围,而在 min(badTimeseries$startTime) 和 max(badTimeseries$startTime) 之间有很多好的时间范围。此外,想象一下 min(mainTimeSeries$time)==min(badTimeSeries$startTime) 和 max(mainTimeSeries$time)==max(badTimeSeries$startTime),然后按照您的解决方案,没有好的数据。
  • 这根本不是你的问题,你在badTimeSeries 上没有endTime。但如果是这样的话,我会使用lubridateintervals%within%
猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2010-12-27
  • 2014-05-13
  • 1970-01-01
相关资源
最近更新 更多