R中如何在两日期区间为声学接收站数据补全按月唯一条目
实现逻辑
核心是把原有逐站点的单行部署记录,按实际在水的时间区间拆成逐月度的独立条目,再衔接你现有的sf绘图流程,具体步骤如下:
1. 基础数据预处理
先把原始csv里的部署、回收日期字符串转成R可计算的日期格式,这步是后续时间序列生成的基础,不做的话时间计算会直接报错:
# 加载所需依赖包 library(lubridate) library(tidyr) library(dplyr) library(sf) # 读入原始数据 deploy_raw <- read.csv("Deployment_Database_CLEAN_MONTH2.csv", header=TRUE, stringsAsFactors = F) # 按实际日期格式调整format参数,比如你的日期是2013/1/5就改成"%Y/%m/%d" deploy_raw$deploy_date <- as.Date(deploy_raw$deploy_date, format = "%Y-%m-%d") deploy_raw$recover_date <- as.Date(deploy_raw$recover_date, format = "%Y-%m-%d")
2. 生成逐月度的部署记录
对每个站点拆分出整个部署周期里覆盖的所有自然月,每个月生成一条独立条目,保留原站点的坐标信息:
deploy_monthly <- deploy_raw %>% # 替换成数据集中站点唯一标识的列名 group_by(stn_id) %>% reframe( # 生成从部署当月到回收当月的连续月度序列 month_seq = seq( from = floor_date(deploy_date, unit = "month"), to = floor_date(recover_date, unit = "month"), by = "month" ), # 同步保留站点固定属性(经纬度) stn_long = first(stn_long), stn_lat = first(stn_lat) ) %>% # 生成统一的年-月分面字段 mutate( Month = format(month_seq, "%Y-%m") ) %>% # 转成空间sf对象,适配绘图逻辑 st_as_sf(coords = c("stn_long","stn_lat"), crs = 4326)
以上逻辑会覆盖从部署当月到回收当月的所有完整月份,例如2013年1月部署、2014年6月回收的站点,会自动生成2013-01到2014-06共18条独立条目,对应每月在水的状态。
3. 替换绘图数据源
不需要修改你原有地图的图层配置,只需要把绘图时的部署点数据源换成上面生成的逐月数据集即可:
detect_can <- detect[detect$EEZ=='Canada',] p <- ggplot(land.all) + geom_sf() + # 替换为逐月拆分后的站点空间对象 geom_sf(data=deploy_monthly, col='blue', alpha = 0.5)+ geom_sf(data=detect_can, col='red')+ xlab('Longitude')+ ylab('Latitude')+ coord_sf(xlim = c(-75, -45), ylim = c(40, 55), expand = FALSE) + facet_wrap(~Month) + theme_bw() ggsave(plot = p, filename = "figure MONTH4.jpg", width = 16, height = 12)
常见问题调整
- 如果运行后出现空月份、NA值,先单独检查
deploy_raw中的两个日期字段的解析结果,修正原始csv里格式不统一的日期条目,避免解析失败。 - 如果分面出现月份排序混乱(比如字母排序导致2013-10排在2013-02前面),先把
Month字段转成按时间顺序排列的因子类型再绘图。
内容的提问来源于stack exchange,提问作者akasharkman
相关产品推荐
相关产品推荐

