You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:20:32