【问题标题】:subset data by time interval if I have all data between time interval如果我有时间间隔之间的所有数据,则按时间间隔子集数据
【发布时间】:2018-07-18 01:43:35
【问题描述】:

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

      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 点、下午 12 点、下午 1 点、下午 2 点、下午 3 点、下午 4 点),我想要按时间间隔(上午 11 点到下午 4 点之间的所有数据)对数据集进行子集化) 在每一天。我想最终将 mat.3 每天每个时间间隔(上午 11 点到下午 4 点)的值相加。

我试过了:

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

但这会返回上午 11 点到下午 4 点之间任何时间的所有数据,但通常我只会有数据,例如某一天的中午 12 点和下午 1 点。

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

【问题讨论】:

标签: r datetime time intervals


【解决方案1】:

尝试在您的数据框中创建一个仅包含小时的新变量。

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),]

【讨论】:

    【解决方案2】:

    对@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)
    

    【讨论】:

    • 谢谢!这很有帮助!
    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2011-05-07
    • 2018-12-29
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多