在R的data.table中按日期过滤特定时间段数据
解决data.table中按日期过滤指定时间范围行的问题
首先纠正你代码里的一个小错误:as.POSIXct的格式参数写错了,分钟应该用%M,秒用%S,原代码里的%m是月份,会导致时间转换出错。正确的转换代码应该是:
data = data.table::data.table(date_time = c("2019-05-20 14:20:00","2019-05-20 14:21:00","2019-05-20 14:22:00","2019-05-20 14:23:00","2019-05-20 14:24:00", "2019-05-21 14:20:00","2019-05-21 14:21:00","2019-05-21 14:22:00","2019-05-21 14:23:00","2019-05-21 14:24:00", "2019-05-22 14:20:00","2019-05-22 14:21:00","2019-05-22 14:22:00","2019-05-22 14:23:00","2019-05-22 14:24:00") ) # 修正格式参数 data[ , date_time := as.POSIXct(date_time, format = "%Y-%m-%d %H:%M:%S") ]
接下来提供三种适配按每个日期重复过滤的方案:
方案1:提取时间字符串进行筛选
直接提取每行的时间部分,判断是否不在目标区间内:
# 保留时间不在14:21:00到14:23:00之间的行 filtered_data1 = data[!(format(date_time, "%H:%M:%S") %between% c("14:21:00", "14:23:00"))]
方案2:使用ITime类型高效筛选
利用data.table的ITime类型处理时间部分,这种方式比字符串比较更高效:
# 将date_time转换为ITime类型(仅保留时分秒) data[ , time_only := as.ITime(date_time)] # 筛选不在目标时间范围内的行 filtered_data2 = data[!(time_only %between% c(as.ITime("14:21:00"), as.ITime("14:23:00")))] # 可选:删除临时列 filtered_data2[, time_only := NULL]
方案3:按日期分组后过滤完整时间范围
如果需要更精确的按日期+时间范围过滤(比如考虑时区等场景),可以按日期分组,计算当天的目标时间区间:
# 提取日期部分作为分组键 data[ , date_part := as.Date(date_time)] # 按日期分组,计算当天的14:21和14:23时间点 filtered_data3 = data[ , .SD[!(date_time %between% c(as.POSIXct(paste(date_part, "14:21:00")), as.POSIXct(paste(date_part, "14:23:00"))))], by = date_part] # 可选:删除临时列 filtered_data3[, date_part := NULL]
这三个方案都能实现每个日期下都移除14:21:00到14:23:00之间的行的需求,其中方案2的性能最优,适合处理大数据量。
内容的提问来源于stack exchange,提问作者jalaj pathak
相关产品推荐
相关产品推荐

