如何自动化计算手动水位采集时刻的Transducer水位值?
解决方案:自动化计算手动采集时刻对应的传感器水位值
数据预处理(修正输入格式)
首先修正你提供的dput数据(原数据Date_Time格式不符合R语法,需转为字符型):
df <- structure(list( Date_Time = c("09/30/2022 12:00", "10/01/2022 12:00", "10/01/2022 09:40", "10/02/2022 12:00", "10/03/2022 12:00"), Manual = c(NA, NA, 431.51, NA, NA), Transducer = c(431.54, 431.59, NA, 431.45, 431.41) ), class = "data.frame")
自动化计算步骤
使用dplyr和lubridate包实现批量计算,步骤如下:
1. 转换时间格式并提取小时数
将字符型日期转为可计算的时间格式,同时把手动采集的时分转换为十进制小时数:
library(dplyr) library(lubridate) df <- df %>% mutate( Date_Time = mdy_hm(Date_Time), # 计算采集时刻距离当日0点的十进制小时数(如09:40=9+40/60≈9.6667) hour_decimal = hour(Date_Time) + minute(Date_Time)/60 )
2. 匹配前后传感器数据并计算目标值
提取有效传感器数据,对每个手动采集记录自动匹配前后最近的传感器值,再按公式计算:
# 提取所有非NA的传感器数据行 sensor_data <- df %>% filter(!is.na(Transducer)) %>% select(Date_Time, Transducer) # 处理手动采集记录,计算对应传感器值 manual_calc <- df %>% filter(!is.na(Manual)) %>% mutate( # 找到采集时刻前最近的传感器值(TDX a) TDX_a = sensor_data$Transducer[findInterval(Date_Time, sensor_data$Date_Time)], # 找到采集时刻后最近的传感器值(TDX b) TDX_b = sensor_data$Transducer[findInterval(Date_Time, sensor_data$Date_Time) + 1], # 按公式计算x和最终值 x = (TDX_a - TDX_b)/24, Calculated_Transducer = TDX_a + x * hour_decimal )
3. 合并结果到原数据框
将计算结果合并回原数据,新增Calculated_Transducer列存储结果:
df_final <- df %>% left_join(manual_calc %>% select(Date_Time, Calculated_Transducer), by = "Date_Time")
多监测点批量处理
如果数据包含多个监测点(新增Site_ID列标识),只需分组处理即可:
df_final_multi <- df %>% group_by(Site_ID) %>% mutate( Date_Time = mdy_hm(Date_Time), hour_decimal = hour(Date_Time) + minute(Date_Time)/60 ) %>% group_split() %>% map_dfr(function(site_df) { sensor_data <- site_df %>% filter(!is.na(Transducer)) %>% select(Date_Time, Transducer) manual_calc <- site_df %>% filter(!is.na(Manual)) %>% mutate( TDX_a = sensor_data$Transducer[findInterval(Date_Time, sensor_data$Date_Time)], TDX_b = sensor_data$Transducer[findInterval(Date_Time, sensor_data$Date_Time) + 1], x = (TDX_a - TDX_b)/24, Calculated_Transducer = TDX_a + x * hour_decimal ) site_df %>% left_join(manual_calc %>% select(Date_Time, Calculated_Transducer), by = "Date_Time") })
结果验证
以样本数据中10/01/2022 09:40的手动记录为例:
- TDX a = 431.54(09/30 12:00的传感器值)
- TDX b = 431.59(10/01 12:00的传感器值)
- 计算得
Calculated_Transducer≈431.52,与手动计算逻辑一致。
内容的提问来源于stack exchange,提问作者JackWassik
相关产品推荐
相关产品推荐

