如果我在时间间隔之间有所有数据,则按时间间隔的子集数据

时间:2018-02-07 17:01:31

标签: r datetime time intervals

我有一个如下所示的数据框:

      X id mat.1      mat.2       mat.3               times
1     1  1  Anne 1495206060  18.5639404 2017-05-19 11:01:00
2     2  1  Anne 1495209660   9.0160321 2017-05-19 12:01:00
3     3  1  Anne 1495211460  37.6559161 2017-05-19 12:31:00
4     4  1  Anne 1495213260  31.1218856 2017-05-19 13:01:00
....
164 164  1  Anne 1497825060   4.8098351 2017-06-18 18:31:00
165 165  1  Anne 1497826860  15.0678781 2017-06-18 19:01:00
166 166  1  Anne 1497828660   4.7636241 2017-06-18 19:31:00

我想要的是按时间间隔对所有数据进行子集化(所有数据在上午11点到下午4点之间)如果每小时至少有一个数据点(上午11点,下午12点,下午2点,下午3点,下午4点,下午4点)每一天。我想最终总结每天每个时间间隔(上午11点到下午4点)的mat.3值。

我做过尝试:

sub.1 <- subset(t,format(times,'%H')>='11' & format(times,'%H')<='16')

但这会返回上午11点到下午4点之间任何时间的所有数据,但通常我只会提供数据,例如特定日期的12点和1点PM。

我只想要从上午11点到下午4点每小时都有数据的日子。我有什么想法可以试试吗?

2 个答案:

答案 0 :(得分:0)

尝试在数据框中创建一个只有小时的新变量。

your_data$hour<-format(your_data$times, format="%H:%M:%S") 

然后,使用这个新变量尝试执行下一个:

#auxiliar variable with your interval of time
your_data$aux_var<-ifelse(your_data$hour >"11:00:00" || your_data$hour<"16:00:00" ,1,0)

因此,下一步是在aux_var==1

时过滤您的数据
your_data[which(your_data$aux_var ==1),]

答案 1 :(得分:0)

@Henry Navarro的补充,解决了问题中提到的其他问题。

如果我以正确的方式理解,问题的另一个问题是找到日期,使得在一天中给定间隔的每小时至少存在数据点。遵循@Henry Navarro解决方案风格的可能方式如下:

library(lubridate)
your_data$hour_only <- as.numeric(format(your_data$times, format = "%H"))
your_data$days <- ymd(format(your_data$times, "%Y-%m-%d"))
your_data_by_days_list <- split(x = your_data, f = your_data$days)

# the interval is narrowed for demonstration purposes
hours_intervals <- 11:13
all_hours_flags <- data.frame(days = unique(your_data$days), 
    all_hours_present = sapply(function(Z) (sum(unique(Z$hour_only) %in% hours_intervals) >= 
    length(hours_intervals)), X = your_data_by_days_list), row.names = NULL)
your_data <- merge(your_data, all_hours_flags, by = "days")

现在列"all_hours_present"表示相应日期的数据包含给定hours_intervals中每小时的至少一个值。您可以使用此列来分组数据

subset(your_data, all_hours_present)