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

R语言绘制含缺失日期范围的时间序列:数据处理实现问询

在R中绘制带缺失日期范围的时间序列(含数据预处理)

我完全懂这种“别人觉得简单但自己就是卡壳”的无奈!咱们从你的数据框出发,一步步搞定这个问题。首先先把你提供的数据框结构明确下来(我帮你补全了area..km.2.列的缺失内容,方便后续操作):

A <- structure(
  list(
    start..yyyy.mm. = c(197901L, 197901L, 197901L, 197901L, 197901L),
    X.yyyy.mm. = c(197901L, 197904L, 197908L, 197902L, 197902L),
    duration = c(1L, 4L, 8L, 2L, 2L),
    area..km.2. = structure(
      c(1L, 2L, 4L, 3L, 5L),
      .Label = c(
        "46952.85",
        "c(125267.7, 72379.43, 72468.91, 13200.26)",
        "c(19814.74, 39570.96)",
        "c(26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 26513.05)",
        "c(56789.12, 67890.12)"
      )
    )
  ),
  class = "data.frame",
  row.names = c(NA, -5L)
)

第一步:数据预处理

你的数据有两个关键问题需要先解决:日期是整数格式、area..km.2.列是字符串形式的向量。

1. 转换日期格式

把start..yyyy.mm.和X.yyyy.mm.转成R能识别的日期类型,我们先把整数转成yyyy-mm格式的字符串,再用lubridate包的ym()函数处理:

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

A <- A %>%
  mutate(
    start_date = ym(paste0(substr(as.character(start..yyyy.mm.), 1, 4), "-", substr(as.character(start..yyyy.mm.), 5, 6))),
    end_date = ym(paste0(substr(as.character(X.yyyy.mm.), 1, 4), "-", substr(as.character(X.yyyy.mm.), 5, 6)))
  )

2. 解析area列的字符串向量

area..km.2.列现在是c(...)格式的字符串,我们用eval(parse(text=...))把它转成数值向量,再把每个向量的元素拆成单独的行,让每个月份对应一个面积值:

A <- A %>%
  mutate(area_list = lapply(area..km.2., function(x) eval(parse(text = x)))) %>%
  unnest(area_list) %>%
  # 生成每个时间段内的所有月份
  mutate(month_seq = map2(start_date, duration, ~seq(.x, by = "month", length.out = .y))) %>%
  unnest(month_seq) %>%
  select(month_seq, area = area_list)

第二步:处理缺失日期范围

我们需要生成从最早到最晚月份的完整时间序列,再和现有数据合并,自动标记缺失值:

# 生成完整的月份序列
full_month_seq <- seq(min(A$month_seq), max(A$month_seq), by = "month") %>%
  as.data.frame() %>%
  rename(month_seq = .)

# 合并数据,缺失的area会自动填充为NA
full_ts_data <- full_month_seq %>%
  left_join(A, by = "month_seq")

第三步:绘制带缺失范围的时间序列

用ggplot2绘制,缺失的日期范围会用半透明色块标记,现有数据用折线和点展示:

ggplot(full_ts_data, aes(x = month_seq, y = area)) +
  geom_line(color = "#2c3e50", size = 1) +
  geom_point(color = "#e74c3c") +
  # 标记缺失的日期区间
  geom_rect(
    data = full_ts_data %>% filter(is.na(area)),
    aes(xmin = month_seq, xmax = lead(month_seq), ymin = -Inf, ymax = Inf),
    fill = "#f39c12", alpha = 0.2
  ) +
  labs(x = "日期", y = "面积 (km²)", title = "带缺失日期范围的面积时间序列") +
  theme_minimal()

这样你就能得到一张清晰的时间序列图,缺失的日期段会直观显示出来,现有数据的变化趋势也一目了然。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:38