如何用na.approx对不规则时间间隔数据插值每日午夜值?
用
na.approx估算每日00:00时刻的读数 完整实现代码
# 安装并加载所需包(首次运行时需要安装) # install.packages(c("dplyr", "zoo")) library(dplyr) library(zoo) # 原始数据集 df1 <- read.table(text = "DT odczyt.1 odczyt.2 '2023-08-16 00:00:00' 482 1.5 '2023-08-16 23:55:00' 483 4.3 '2023-08-17 05:00:00' 484 1.6 '2023-08-17 23:59:45' 485 5.6 '2023-08-18 00:50:00' 486 1.5 '2023-08-18 23:50:45' 487 6.8 '2023-08-19 00:03:00' 586 1.5 '2023-08-19 05:09:45' 578 7.9 '2023-08-19 17:01:00' 521 11.5 '2023-08-19 18:01:15' 365 8.5 '2023-08-19 22:59:30' 490 1.8 '2023-08-19 23:59:45' 456 6.6 '2023-08-20 00:48:00' 478 1.5 '2023-08-20 03:03:00' 461 1.54 '2023-08-20 05:04:15' 397 1.6 '2023-08-20 19:07:00' 492 6.6 '2023-08-20 23:59:45' 493 3.8 '2023-08-21 01:00:00' 471 9.2 '2023-08-21 07:00:30' 493 8.5 '2023-08-21 13:21:45' 495 5.5", header = TRUE) %>% mutate(DT = as.POSIXct(DT)) # 生成需要补充的每日00:00时间点 date_range <- seq.Date(from = as.Date(min(df1$DT)), to = as.Date(max(df1$DT)), by = "day") new_times <- as.POSIXct(paste0(date_range, " 00:00:00")) new_rows <- data.frame(DT = new_times, odczyt.1 = NA, odczyt.2 = NA) # 合并数据并按时间排序 combined_df <- bind_rows(df1, new_rows) %>% arrange(DT) # 执行线性插值 result_df <- combined_df %>% mutate(across(c(odczyt.1, odczyt.2), ~na.approx(.x, x = DT))) # 查看每日00:00的估算结果 result_df %>% filter(format(DT, "%H:%M:%S") == "00:00:00")
关键步骤说明
- 生成目标时间点:从原始数据的日期范围中,生成每天00:00的时间戳,作为需要插值的位置。
- 合并与排序:将原始数据和带NA值的新增时间行合并,严格按时间排序,保证插值的顺序逻辑正确。
- 线性插值:利用
zoo包的na.approx函数,基于时间列DT对读数列进行线性插值,自动填补NA值为对应00:00时刻的估算值。
运行代码后,result_df即为包含每日00:00估算值的完整数据集,其中2023-08-17 00:00:00的odczyt.1约为483.016,odczyt.2约为4.256,与预期结果一致。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

