R帮助用POSIXct对每日范围进行子集化

时间:2014-09-21 05:59:58

标签: r posixct

我正在尝试在POSIXct时间序列的每一天内部化一个区间。

假设我有一个3天的样本集,每15分钟采样一次。

sample <- seq(as.POSIXct("2000-01-01 00:00:00"),as.POSIXct("2000-01-03 24:00:00"),by=15*60)

 [1] "2000-01-01 00:00:00 PST" "2000-01-01 00:15:00 PST" "2000-01-01 00:30:00 PST" "2000-01-01 00:45:00 PST" "2000-01-01 01:00:00 PST" "2000-01-01 01:15:00 PST" "2000-01-01 01:30:00 PST" "2000-01-01 01:45:00 PST"
 [9] "2000-01-01 02:00:00 PST" "2000-01-01 02:15:00 PST" "2000-01-01 02:30:00 PST" "2000-01-01 02:45:00 PST" "2000-01-01 03:00:00 PST" "2000-01-01 03:15:00 PST" "2000-01-01 03:30:00 PST" "2000-01-01 03:45:00 PST"
[17] "2000-01-01 04:00:00 PST" "2000-01-01 04:15:00 PST" "2000-01-01 04:30:00 PST" "2000-01-01 04:45:00 PST"

使用lubridate包,我可以相当容易地按小时间隔进行分组。

sample_subset <- sample[hour(sample) >= 9 & hour(sample) =< 12]

 [1] "2000-01-01 10:00:00 PST" "2000-01-01 10:15:00 PST" "2000-01-01 10:30:00 PST" "2000-01-01 10:45:00 PST" "2000-01-01 11:00:00 PST" "2000-01-01 11:15:00 PST" "2000-01-01 11:30:00 PST" "2000-01-01 11:45:00 PST"
"2000-01-02 10:00:00 PST" "2000-01-02 10:15:00 PST" "2000-01-02 10:30:00 PST" "2000-01-02 10:45:00 PST" "2000-01-02 11:00:00 PST" "2000-01-02 11:15:00 PST" "2000-01-02 11:30:00 PST" "2000-01-02 11:45:00 PST"

问题在于如何在每天内部固定每小时/每分钟的固定间隔。我希望从9:30开始 每天12:00。如果我只是添加一个过滤器,例如分钟(样本)&gt; 30,它将过滤掉该范围内每一小时的分钟数。

我查看了几个相关的帖子;但他们只显示每小时过滤。似乎应该有一个相当简单的子集条件,我不理解。像样本[分钟(样本)[小时(样本)== 9]> 30]这样的东西虽然不起作用。还有其他简单的想法吗?

*修改

基于ilister的想法,我只是使用lubridate扩展了布尔索引。 我不知何故错过了ORing。

cond1 <-  hour(sample) >= 9 & minute(sample) > 30

cond2 <-  hour(sample) < 12

cond3 <-  hour(sample) > 9

       sample[(cond1 | cond3) & cond2] 

       "2000-01-01 09:45:00 PST" "2000-01-01 10:00:00 PST" "2000-01-01 10:15:00 PST" "2000-01-01 10:30:00 PST" "2000-01-01 10:45:00 PST"
   "2000-01-01 11:00:00 PST" "2000-01-01 11:15:00 PST" "2000-01-01
   11:30:00 PST"

2 个答案:

答案 0 :(得分:1)

尝试使用indexClass {xts}:

中的关节条件进行子集化
require(xts)
sample <- seq(as.POSIXct("2000-01-01 00:00:00"),
              as.POSIXct("2000-01-03 24:00:00"),by=15*60)
xsample <- xts(1:289, order.by=sample)
xsample[.indexhour(xsample)==9 & .indexmin(xsample) %in% 15:59]

将9:15中的结果返回到<10:00。

然后使用标准.indexhour加入该索引,将设置返回10:00到12:00。

xsample[c(which(.indexhour(xsample)==9 & .indexmin(xsample) %in% 15:59),
          which(.indexhour(xsample) %in% 10:11))]

或者如果你对布尔运算符感到满意,那就更优雅了:

xsample[.indexhour(xsample)==9 & .indexmin(xsample) %in% 15:59 |
        .indexhour(xsample) %in% 10:11]

答案 1 :(得分:0)

在基数R中,POSIXlt可能有用。试试这个:

    sampleLT<-as.POSIXlt(sample)
    secFromMidnigth<-sampleLT$hour*3600+sampleLT$min*60+sampleLT$sec
    sample[secFromMidnigth>9*3600+30*60 & secFromMidnigth<3600*12]

您可以从给定日期时间的午夜提取秒数,看它是否大于9 * 3600 + 30 * 60(09:30)以及3600 * 12(12:00)之下。< / p>

我对lubridate的了解不多,但正如我从您的OP中看到的那样,您也可以这样做:

    sample[hour(sample)*60+minute(sample)>9*60+30 & hour(sample)<12]