R语言提取CSV工作日时段CO₂最大值:时间提取返回NA问题求助
解决CSV环境数据筛选与CO₂最大值计算问题
问题根源
你用parse_date_time(df$timestamp, '%H:%M:%S')生成df$time时返回NA,是因为df$timestamp已经被ymd_hms()转换成了datetime对象,而parse_date_time()是用来解析字符串格式的时间,不是从已有的datetime对象中提取时间部分,所以会返回无效值。
修正方案
不需要单独提取time列,直接利用lubridate的时间函数筛选,或者用hms工具提取纯时间部分,以下是两种可行写法:
方法1:直接用hour函数筛选时段(简洁版)
这种方式无需额外创建时间列,直接通过小时范围筛选:
library(lubridate) library(dplyr) # 读取数据并转换时间格式 df <- read.csv("data.csv", nrows=50) df$timestamp <- ymd_hms(df$timestamp) df$date <- date(df$timestamp) # 筛选工作日+08:00-17:00的数据,计算每日CO₂最大值 result <- df %>% filter(!is.weekend(date), hour(timestamp) >= 8, hour(timestamp) <= 17) %>% group_by(date) %>% summarize(max_co2 = max(co2, na.rm = TRUE)) # na.rm避免NA干扰计算 print(result)
方法2:提取纯时间列进行筛选(保留时间列版)
如果需要保留时间字段,可以用hms包从datetime对象中提取纯时间部分:
library(lubridate) library(dplyr) library(hms) # 需加载hms包 df <- read.csv("data.csv", nrows=50) df$timestamp <- ymd_hms(df$timestamp) df$date <- date(df$timestamp) # 从datetime对象提取HH:MM:SS格式的纯时间 df$time <- as.hms(df$timestamp) # 筛选并计算最大值 result <- df %>% filter(!is.weekend(date), time >= hms("08:00:00"), time <= hms("17:00:00")) %>% group_by(date) %>% summarize(max_co2 = max(co2, na.rm = TRUE)) print(result)
额外注意点
- 原代码中
summarize(min = min(value), max = max(value))里的value是错误的,需替换为目标列co2 - 加入
na.rm = TRUE可以避免数据中存在NA时导致计算结果失效
内容的提问来源于stack exchange,提问作者Brendon Shaw
相关产品推荐
相关产品推荐

