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

如何使用lubridate提取每日重复时间区间内的数据?

解决方案:提取每日7:00-17:00的分钟级数据

针对你的大样本数据集(20万/40万行),结合Tidyverse和lubridate工具,以下是几种高效可行的过滤方法:

方法1:时间分量数值判断(最简洁高效)

利用lubridate的时间提取函数,将小时、分钟转为总分钟数后直接过滤,运算速度快,适合大数据量:

library(tidyverse)
library(lubridate)

df_filtered <- df %>%
  filter(between(hour(datetime)*60 + minute(datetime), 7*60, 17*60))

解释:把每日时间转换成从0点开始的总分钟数(7:00=420分钟,17:00=1020分钟),用between()直接筛选落在区间内的记录,逻辑清晰且性能最优。

方法2:生成当日完整时间区间判断

如果需要明确使用区间逻辑,可为每行生成当日7:00-17:00的完整datetime区间,再用%within%匹配:

df_filtered <- df %>%
  mutate(
    day_start = floor_date(datetime, "day"),
    valid_interval = interval(day_start + hours(7), day_start + hours(17))
  ) %>%
  filter(datetime %within% valid_interval) %>%
  select(-day_start, -valid_interval) # 清理临时列

解释:这里的区间是包含日期的完整datetime区间,和每行的datetime类型匹配,因此%within%可以正常生效,适合需要保留区间逻辑的场景。

方法3:转为hms时间对象判断

若想保留单独的时间列,可将时间转为hms类型后直接比较:

library(tidyverse)
library(hms)

df_filtered <- df %>%
  mutate(time = as_hms(datetime)) %>%
  filter(time >= parse_hm("07:00") & time <= parse_hm("17:00"))

解释:as_hms()会提取datetime中的时分秒生成专门的时间对象,支持直接大小比较,比字符串格式的时间列更可靠。


原有方法失效原因说明

  • interval(hm('07:00'), hm('17:00'))创建的是时长区间(仅表示7小时到17小时的时长范围),而非一天中的时间点区间,无法匹配完整datetime。
  • format(datetime, "%H:%M")生成的是字符串,%within%仅支持lubridate的datetime/interval类型,不支持字符串比较。
  • 0700:1700是整数序列,和时间格式完全不匹配,自然无法过滤有效记录。

内容的提问来源于stack exchange,提问作者Bettina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:05:23