从R中的日期向量中提取间隔

时间:2017-03-07 09:48:52

标签: r date

我有一个简单的日期矢量:

> head(as.vector(times))
  [1] "2015.08.04 10:00:00.790395" "2015.08.04 10:00:00.884402" 
      "2015.08.04 10:00:01.015408" "2015.08.04 10:00:01.016410"
  [5] "2015.08.04 10:00:01.017410" "2015.08.04 10:00:01.370429"

矢量真的很大:约500万件物品。 我想从这些数据中提取5分钟的间隔。我们来看看算法:

t0 <- strptime("2015.08.04 10:00:00.000000", format = "%Y.%m.%d %H:%M:%OS")
t1 <- strptime("2015.08.04 10:05:00.000000", format = "%Y.%m.%d %H:%M:%OS")
times <- strptime(times, format = "%Y.%m.%d %H:%M:%OS")
# indexes of last dates in each interval
lastIntervalIndexes <- c()
counter <- 1
while (t1 < times[length(times)]) {
   dates <- which(times >= t0 & times < t1)
   if (length(dates) > 0) {
      lastIntervalIndexes[counter] <- last(dates)
      counter <- counter + 1
   }
   t0 <- t1
   t1 <- t1 + 5 * 60
}

这项工作正常但很长。如何以最快的方式进行此操作?

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

您可以使用library(lubridate)并根据您的需要调整以下示例:

library(lubridate)

times <- c("2015.08.04 10:00:00.790395", "2015.08.04 10:00:00.884402",
           "2015.08.04 10:04:01.015408", "2015.08.04 10:05:01.016410",
           "2015.08.04 10:06:01.017410", "2015.08.04 10:10:01.370429")

interval <- interval(start = ymd_hms("2015.08.04 10:00:00.000000"),
                       end = ymd_hms("2015.08.04 10:05:00.000000"))
times <- ymd_hms(times)
inside <- times %within% interval
times[inside]

# "2015-08-04 10:00:00 UTC" "2015-08-04 10:00:00 UTC" "2015-08-04 10:04:01 UTC"

请注意,我已在times更改了您的部分时间。