如何按不同长度的PFL_counter组将datetime列取整到小时?
湖泊浮标深度剖面数据的时间统一取整方案
问题背景
有58522条湖泊高频浮标深度剖面测量数据,数据框包含PFL_counter(深度剖面计数器)、depth、temp_C和datetime列,每组剖面的深度行数不固定。需要将每个PFL_counter组的所有datetime值统一取整到该剖面起始时间对应的小时,但遇到两个问题:
- 部分剖面耗时超过1小时,单组内
datetime跨小时,直接用floor_date会让同组出现不同小时的时间,后续pivot_wider操作会产生NA值 - 使用
openair::timeAverage会聚合数据,丢失原始深度与温度的对应关系,不符合需求
解决方案
核心思路是按剖面分组后,提取每组的最早时间作为剖面起始时间,对这个起始时间取整到小时,再将整组的datetime替换为这个统一的取整后时间,既保留所有原始数据,又保证同组时间一致。
代码实现
# 加载所需工具包(优先用dplyr,避免与plyr冲突) library(rLakeAnalyzer) library(tidyverse) # 用户提供的示例数据 PFL_counter = c(2,2,2,3,3,3,4,4) depth = c(0.5,1.0,1.5,0.5,1.0,1.5,0.5,1.0) temp_C = c(14.27,14.22,14.20,14.23,14.23,14.22,14.23,14.22) datetime = c("5/11/23 17:01","5/11/23 17:02","5/11/23 17:04", "5/11/23 18:01","5/11/23 18:22","5/11/23 19:14", "5/11/23 19:14","5/11/23 19:16") Carmi_23 = data.frame(PFL_counter, depth ,temp_C, datetime) Carmi_23$datetime = mdy_hm(Carmi_23$datetime) # 核心处理逻辑 Carmi_23_processed <- Carmi_23 %>% group_by(PFL_counter) %>% # 提取组内最早时间并取整到小时,替换整组的datetime mutate(datetime = floor_date(min(datetime), unit = "hour")) %>% ungroup() # 查看处理后的数据 print(Carmi_23_processed)
代码说明
group_by(PFL_counter):将数据按每个深度剖面分组min(datetime):获取当前剖面的起始时间(组内最早的记录时间)floor_date(..., unit = "hour"):把起始时间取整到最近的小时mutate(datetime = ...):将整组的datetime统一替换为这个取整后的时间,确保同剖面所有深度记录的时间完全一致- 处理后的数据可直接用于
pivot_wider操作,不会出现跨小时导致的NA,同时完整保留了原始的深度-温度对应关系
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

