R - 时间序列过滤

6

我有一个时间序列

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
@GSee 谢谢指出。已修改。 - 2sb
1个回答

6

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
@Justin,“仅使用基本R”解决方案中,您只使用了一个bad_start和bad_end日期,但是我上面的问题有一系列的bad_start和bad_end日期。 - 2sb
@2sb,你的问题涉及到一系列的“startTimes”。我使用了从min(badTimeseries$startTime)max(badTimeseries$startTime)的范围。如果任何一个mainTimeSeries值在这之间,它就会被删除。与mainTimeSeries[!mainTimeSeries %in% badTimeSeries$startTime]相同。 - Justin
@Justin 抱歉如果我的问题没有表述清楚,但你不能使用min()和max()。每一行的badTimeSeries都代表了一个不好的时间范围,而在min(badTimeseries$startTime)和max(badTimeseries$startTime)之间有很多好的时间范围。此外,假设min(mainTimeSeries$time)==min(badTimeSeries$startTime)且max(mainTimeSeries$time)==max(badTimeSeries$startTime),那么按照你的解决方案,就没有好的数据。 - 2sb
这并不是你的问题的全部,badTimeSeries 上没有 endTime。但如果是这种情况,我会使用 lubridateintervals%within% - Justin
@Justin,感谢您指出。我已经编辑了我的问题,包括了endTime。 - 2sb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接