【问题标题】:filter/subset a dataframe based on multiple time periods in R基于R中的多个时间段过滤/子集数据帧
【发布时间】:2018-06-23 02:26:33
【问题描述】:

我需要使用多个时间段过滤或子集一个大型(100,000 多行)数据帧。我基本上需要删除数据框中的日期/时间在时间​​段表中的开始日期/时间和结束日期/时间之间的行。我发现这篇文章描述了我的问题 (Subsetting data by multiple date ranges - R),但我似乎无法让代码正常工作。任何建议表示赞赏。示例数据见下文。

time period table:
start,end
7/26/2017 14:05,7/26/2017 16:05
8/24/2017 13:40,8/24/2017 15:40
6/29/2017 20:45,6/30/2017 0:41

dataframe:
time,temp.c,lux,serial.num
6/29/2017 20:40,33.63,0,20168779
6/29/2017 20:40,33.11,0,20168780
6/29/2017 20:50,20.42,602.8,20148333
6/29/2017 20:50,20.32,721.2,20148334
6/29/2017 20:50,19.75,3788.9,20148335
7/26/2017 16:00,22.9,183,20168779
7/26/2017 16:00,23.29,1237.9,20168780
7/26/2017 16:10,23.38,1173.3,20148333
7/26/2017 16:10,23.67,839.6,20148334
8/24/2017 15:40,24.06,387.5,20168780
8/24/2017 15:50,23.58,0,20148332

【问题讨论】:

    标签: r filter subset


    【解决方案1】:

    数据:

    time_period_table <- data.frame(start=c('7/26/2017 14:05', '8/24/2017 13:40', '6/29/2017 20:45'), end=c('7/26/2017 16:05', '8/24/2017 15:40', '6/30/2017 0:41'))
    time_period_table $start <- as.POSIXct(time_period_table $start, format="%m/%d/%Y %H:%M")
    time_period_table $end <- as.POSIXct(time_period_table $end, format="%m/%d/%Y %H:%M")
    
    time_period_table
    

    在数据框中保留日期/时间在开始日期/时间和结束日期/时间之间的行:

    keep_by_date_time <- function(data_frame, start_date, start_time, end_date, end_time) {
        from <- paste(start_date, start_time)
        to <- paste(end_date, end_time)
        sub_frame <- subset(data_frame, start >= as.POSIXct(from) & end <= as.POSIXct(to))
        return(sub_frame)
    }
    

    用法:

    # return rows with date and time between July 26, 2017 at 1:05pm and July 26, 2017 at 5:05pm:
    
    keep_by_date_time(time_period_table, '2017-07-26', '13:05', '2017-07-26', '17:05')
    

    删除数据框中的日期/时间在开始日期/时间和结束日期/时间之间的行:

    remove_by_date_time <- function(data_frame, start_date, start_time, end_date, end_time) {
        from <- paste(start_date, start_time)
        to <- paste(end_date, end_time)
        rem_row <- which(time_period_table$start >= as.POSIXct(from) & time_period_table$end <= as.POSIXct(to))
        rem_frame <- data_frame[-rem_row,]
        return(rem_frame)
    }
    

    用法:

    # remove rows with date and time between August 20, 2017 at 1:05pm and August 26, 2017 at 5:05pm:
    
    remove_by_date_time(time_period_table, '2017-08-20', '13:05', '2017-08-26', '17:05')
    

    【讨论】:

    • 感谢您的代码。我必须删除几个数据框的几组日期之间的数据。我已经尝试过这段代码,但我正在做的事情是不对的。另外,我希望 data_frame 中的行不在关闭表中的日期之间。 library(dplyr) library(lubridate) data_frame$time
    • 假装你有一个功能可以做你想做的事。它会是什么样子?会是这样吗:remove_rows_with_these_dates(list_of_dataframes, list_of_startend_dates)?同一组开始/结束日期是否适用于所有数据框,还是每个数据框都有自己的一组?
    • 是的,该功能可以完成我需要做的事情。
    猜你喜欢
    • 2018-06-07
    • 2019-10-22
    • 2020-02-25
    • 2018-07-08
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多