我有两个数据集:df1
包含时间窗口,代表id
的峰值活动。这些是不连续的时间序列,每个id
有多个窗口(事件),即每个id
具有多个峰值活动时间段。下面是我制作的可复制示例,但不是真实数据。
df1<-data.frame(start_date=seq(as.POSIXct("2014-09-04 00:00:00"), by = "hour", length.out = 10),
end_date=seq(as.POSIXct("2014-09-04 05:00:00"), by = "hour", length.out = 10),
values=runif(20,10,50),id=rep(seq(from=1,to=5,by=1),2))
df2
是id
的一组连续的活动时间序列。我想将date.date
中每个条目/峰值活动的df1
子集化(按id
)。
date1<-data.frame(date=seq(as.POSIXct("2012-10-01 00:00:00"), by = "hour", length.out = 20), id=1)
date2<-data.frame(date=seq(as.POSIXct("2014-10-01 07:00:00"), by = "hour", length.out = 20),id=2)
date3<-data.frame(date=seq(as.POSIXct("2015-10-01 01:00:00"), by = "hour", length.out = 20),id=3)
df2<-data.frame(date=rbind(date1,date2,date3),values=runif(60,50,90))
[目标:仅将df2
中start_time
到end_time
之间的连续时间序列(通过ID)子集化,并保留每个df中的df1
字段。有一个类似的问题values
,但是在那种情况下,时间段是静态的并且是已知的。考虑到每个id的多个事件,我正在努力执行此操作。
您的目标对我来说并不完全清楚,但这是我的阅读:如果date.date中的时间(忽略日期)在start_date和end_date之内,则您希望按ID进行子集划分。
这是我的处理方式:
here
这将导致以下数据框:
library(dplyr)
df1<-data.frame(start_date=seq(as.POSIXct("2014-09-04 00:00:00"), by = "hour", length.out = 10),
end_date=seq(as.POSIXct("2014-09-04 05:00:00"), by = "hour", length.out = 10),
values=runif(20,10,50),id=rep(seq(from=1,to=5,by=1),2))
date1<-data.frame(date=seq(as.POSIXct("2012-10-01 00:00:00"), by = "hour", length.out = 20), id=1)
date2<-data.frame(date=seq(as.POSIXct("2014-10-01 07:00:00"), by = "hour", length.out = 20), id=2)
date3<-data.frame(date=seq(as.POSIXct("2015-10-01 01:00:00"), by = "hour", length.out = 20), id=3)
df2<-data.frame(date=rbind(date1,date2,date3),values=runif(60,50,90))
df <- left_join(df1, df2, by = c("id" = "date.id")) %>%
mutate(date.date.hms = strftime(date.date, format = "%H:%M:%S"),
start_date.hms = strftime(start_date, format = "%H:%M:%S"),
end_date.hms = strftime(end_date, format = "%H:%M:%S")) %>%
mutate(date.date.hms = as.POSIXct(date.date.hms, format="%H:%M:%S"),
start_date.hms = as.POSIXct(start_date.hms, format="%H:%M:%S"),
end_date.hms = as.POSIXct(end_date.hms, format="%H:%M:%S")) %>%
group_by(id) %>%
filter(date.date.hms >= start_date.hms & date.date.hms <= end_date.hms) %>%
select(start_date, end_date, x_values = values.x, y_values = values.y, id, date.date) %>%
ungroup()
我的方法是将日期(在.hms列中)中的时间信息拆分为字符串,然后将其转换回POSIXct对象。这会将今天的日期添加到时间上,但是如果我只想对时间(而不是日期)应用过滤器就可以了。
这是您的追求吗?