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

如何自动化计算手动水位采集时刻的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:30:41