根据时间范围(包括分钟)的子集行

时间:2017-08-21 22:37:50

标签: r datetime time dplyr lubridate

我的问题基本上是对用户Wet Feet先前提出的here问题的跟进:

这是修改过的数据集:

      date_time loc_id node  energy   kgco2 
1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-28 02:10:05     87  103 4.79883 2.57697 
5 2009-02-28 04:05:05     87  103 4.10156 2.20254 
6 2009-02-28 05:05:05     87  103 2.59961 1.39599
7 2009-03-01 03:20:05     87  103 2.59961 1.39599

我试图只获得落在特定时间间隔内的那些行,例如02:05:00至03:30:00

3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-28 02:10:05     87  103 4.79883 2.57697
7 2009-03-01 03:20:05     87  103 2.59961 1.39599

然而,在链接问题(hour包中的lubridate)中应用解决方案是不够的,因为我还必须考虑间隔的分钟数。我可以使用interval包中的lubridate函数来包含分钟,但由于我的数据框涵盖了不同的日期,因此无效。

我特别好奇是否有任何解决方案允许使用dplyr的{​​{1}}动词。或者使用filter包是唯一的前进方式?

1 个答案:

答案 0 :(得分:0)

在下面的代码中,对于每一行,我计算自午夜以来的秒数,并检查该值是否在您的问题的时间范围内,也转换为午夜以来的秒数。我已经包含了使用日期时间格式(和UTC时区)设置数据的代码,因为数据样本没有以可重现的形式提供。

<强> 1。设置数据框

library(lubridate)
library(tidyverse)

dat = read.table(text="date_time time loc_id node  energy   kgco2 
                 1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
                 2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
                 3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
                 4 2009-02-28 02:10:05     87  103 4.79883 2.57697 
                 5 2009-02-28 04:05:05     87  103 4.10156 2.20254 
                 6 2009-02-28 05:05:05     87  103 2.59961 1.39599
                 7 2009-03-01 03:20:05     87  103 2.59961 1.39599", 
                 header=TRUE, stringsAsFactors=FALSE)

dat$date_time = as.POSIXct(paste0(dat$date_time, dat$time), tz="UTC")
dat = dat %>% select(-time)

<强> 2。帮助函数将hms时间字符串转换为午夜后的秒数

hms_to_numeric = function(x) {
  x = as.POSIXct(paste("2010-01-01", x))
  3600 * hour(x) + 60 * minute(x) + second(x)
}

第3。过滤数据以仅包含时间范围内的行

dat %>% 
  filter(between(as.numeric(date_time) - as.numeric(as.POSIXct(substr(date_time,1,10), tz="UTC")), 
                 hms_to_numeric("02:05:00"), 
                 hms_to_numeric("03:30:00")))
            date_time loc_id node  energy   kgco2
1 2009-02-27 02:05:05     87  103 6.40039 3.43701
2 2009-02-28 02:10:05     87  103 4.79883 2.57697
3 2009-03-01 03:20:05     87  103 2.59961 1.39599