将连续时间序列数据分成多个时间段和多个组的非连续时间窗口

问题描述 投票:1回答:1

我有两个数据集: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))

df2id的一组连续的活动时间序列。我想将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))

[目标:仅将df2start_timeend_time之间的连续时间序列(通过ID)子集化,并保留每个df中的df1字段。有一个类似的问题values,但是在那种情况下,时间段是静态的并且是已知的。考虑到每个id的多个事件,我正在努力执行此操作。

r group-by time-series many-to-many subset
1个回答
0
投票

您的目标对我来说并不完全清楚,但这是我的阅读:如果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对象。这会将今天的日期添加到时间上,但是如果我只想对时间(而不是日期)应用过滤器就可以了。

这是您的追求吗?

© www.soinside.com 2019 - 2024. All rights reserved.