R语言时间序列处理:筛选有效小时值≥15的日期数据
小时级时间序列按自然日有效数据量筛选方案
需求说明
- 针对小时粒度时间序列数据,按自然日维度统计每日有效小时值数量
- 筛选规则:单日有效小时值数量大于15则保留该日全部数据,不足15则剔除该日所有数据
- 示例测试数据如下:
{ ts <- seq(as.POSIXct("2015-08-06 12:00"), as.POSIXct("2015-08-21 17:30"), by='60 min') x1<-sample(c(NA,1,4,5),366,replace=TRUE) DF <- data.frame(ts, x1) }
注:以下方案默认「有效小时值」指观测值
x1非缺失的记录,若你的有效判定规则有调整,修改对应判断条件即可。
实现方案
方案1:Base R实现(无需安装额外依赖)
# 给每条记录添加所属自然日标签 DF$date_col <- as.Date(DF$ts) # 按自然日分组,统计每日非缺失的有效记录数 daily_stat <- aggregate( x = list(valid_num = DF$x1), by = list(date = DF$date_col), FUN = function(vec) sum(!is.na(vec)), na.action = NULL ) # 提取符合有效数量要求的日期 target_dates <- daily_stat$date[daily_stat$valid_num > 15] # 筛选最终结果,删除临时生成的日期列 final_df <- DF[DF$date_col %in% target_dates, c("ts", "x1")]
方案2:dplyr实现(语法更简洁)
如果已安装tidyverse/dplyr包,可以用以下更简洁的写法:
library(dplyr) final_df <- DF %>% mutate(date_col = as.Date(ts)) %>% group_by(date_col) %>% filter(sum(!is.na(x1)) > 15) %>% ungroup() %>% select(-date_col)
结果校验
运行以下命令可以快速查看结果中每个自然日的记录条数,确认筛选逻辑符合预期:
table(as.Date(final_df$ts))
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

