我的问题基本上是对用户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
包是唯一的前进方式?
答案 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