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

R语言如何筛选18:00至次日7:00时间区间并绘制数据图

解决时间筛选错误与ggplot不必要连线问题

一、修复时间筛选逻辑

你当前的筛选错误是误用了&逻辑符——"18:00:00"到"23:59:59"和"00:00:00"到"07:00:00"是两个不重叠的区间,应该用|(逻辑或)。另外,用字符串处理时间容易出现边界误差,推荐用lubridate包直接提取小时判断,更可靠:

步骤1:加载包并统一时间格式

library(dplyr)
library(lubridate)
library(ggplot2)

# 确保date列是标准时间格式(如果还不是的话)
Marzo$date <- as.POSIXct(Marzo$date)

步骤2:正确筛选目标时段

data1 <- Marzo %>%
  filter(
    # 保留18:00及之后,或者7:00之前的所有数据
    hour(date) >= 18 | hour(date) < 7
    # 若需要精确包含7:00整的数据,可改为:hour(date)>=18 | (hour(date)==7 & minute(date)==0)
  )

这样就能同时保留每日18:00-23:59和次日0:00-7:00的数据。

二、消除ggplot的不必要连线

筛选后的数据存在时间断层(比如前一天23:55直接跳到次日18:00),ggplot默认会把这些非连续点强行连线。解决方法是给每个连续的夜间时段创建分组ID,让geom_line仅在同一组内连线:

步骤1:添加分组ID列

在筛选前给数据添加分组ID,把当日18:00到次日7:00的所有数据归为同一组:

Marzo <- Marzo %>%
  mutate(
    # 18:00及之后的时间,组ID为当天日期;0:00-7:00的时间,组ID为前一天日期
    group_id = ifelse(hour(date) >= 18, 
                      as.Date(date), 
                      as.Date(date) - days(1))
  )

步骤2:修改ggplot代码,指定分组

在geom_line的aes中加入group=group_id,确保仅同一组内的点连线:

ggplot() +
  geom_line(data= data1, aes(x= date, y= RH3000, colour= "RH3000", group=group_id), 
            lwd=1) +
  geom_line(data= data1, aes(x= date, y= RH4000, colour= "RH4000", group=group_id),
            lwd=1) +
  scale_colour_manual("", breaks=c("RH3000","RH4000"), 
                      values=c("blue4","turquoise1")) +
  scale_x_datetime(labels= date_format("%m-%d %H:%M"), 
                   date_breaks= "12 hours")

完整代码示例

library(dplyr)
library(lubridate)
library(ggplot2)

# 统一时间格式
Marzo$date <- as.POSIXct(Marzo$date)

# 添加夜间时段分组ID
Marzo <- Marzo %>%
  mutate(
    group_id = ifelse(hour(date) >= 18, 
                      as.Date(date), 
                      as.Date(date) - days(1))
  )

# 筛选目标时段
data1 <- Marzo %>%
  filter(hour(date) >= 18 | hour(date) < 7)

# 绘制无多余连线的时序图
ggplot() +
  geom_line(data= data1, aes(x= date, y= RH3000, colour= "RH3000", group=group_id), 
            lwd=1) +
  geom_line(data= data1, aes(x= date, y= RH4000, colour= "RH4000", group=group_id),
            lwd=1) +
  scale_colour_manual("", breaks=c("RH3000","RH4000"), 
                      values=c("blue4","turquoise1")) +
  scale_x_datetime(labels= date_format("%m-%d %H:%M"), 
                   date_breaks= "12 hours")

内容的提问来源于stack exchange,提问作者Gabriel Bernabé García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:45:08