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

在R语言中批量获取多个DataFrame中与指定日期最接近的行

一次性获取多个时间序列DataFrame中最接近指定日期的行

问题描述

我有9个对应不同地点的时间序列DataFrame,目前只能逐个处理来查找与指定日期最接近的行,操作流程如下:

# 读取数据
MNT <- read_excel("MNT_temporal.xlsx")
# 转换日期格式
MNT$date <- ymd_hms(MNT$date)
# 指定输入日期
date <- ymd_hms("2017-09-11 15:47:35")
# 查找与输入日期最接近的行索引
which.min(abs(date - MNT$date))
[1] 6
# 获取对应行的数据
MNT[6,]

其中一个地点(MNT)的数据示例:

# A tibble: 9 x 4
  date                number.of.positives percent_inundated avg_depth_inundated
  <dttm>                            <dbl>             <dbl>               <dbl>
1 2017-09-11 14:05:00                   0                 0                  NA
2 2017-09-11 14:25:00                   0                 0                  NA
3 2017-09-11 14:45:00                   0                 0                  NA
4 2017-09-11 15:05:00                   0                 0                  NA
5 2017-09-11 15:25:00                   0                 0                  NA
6 2017-09-11 15:45:00                   0                 0                  NA
7 2017-09-11 16:05:00                   0                 0                  NA
8 2017-09-11 16:25:00                   0                 0                  NA
9 2017-09-11 16:45:00                   0                 0                  NA

其余地点的读取代码:

MUT <- read_excel("MUT_temporal.xlsx")
MLT <- read_excel("MLT_temporal.xlsx")
MST <- read_excel("MST_temporal.xlsx")
MOL <- read_excel("MOL_temporal.xlsx")
PNT <- read_excel("PNT_temporal.xlsx")
PUT <- read_excel("PUT_temporal.xlsx")
PLT <- read_excel("PLT_temporal.xlsx")
PST <- read_excel("PST_temporal.xlsx")

有没有办法一次性处理所有这些地点的数据?


解决方案

当然可以!我们可以通过把所有DataFrame放进一个列表,再用批量处理函数来一次性完成操作,具体步骤如下:

步骤1:将所有数据框存入列表

先把读取后的所有地点数据整合到一个列表里,这样能极大简化批量操作:

# 加载必要的包
library(readxl)
library(lubridate)

# 读取所有数据并放入列表(键名对应地点名称)
site_data <- list(
  MNT = read_excel("MNT_temporal.xlsx"),
  MUT = read_excel("MUT_temporal.xlsx"),
  MLT = read_excel("MLT_temporal.xlsx"),
  MST = read_excel("MST_temporal.xlsx"),
  MOL = read_excel("MOL_temporal.xlsx"),
  PNT = read_excel("PNT_temporal.xlsx"),
  PUT = read_excel("PUT_temporal.xlsx"),
  PLT = read_excel("PLT_temporal.xlsx"),
  PST = read_excel("PST_temporal.xlsx")
)

# 统一转换所有数据框的date列为datetime格式
site_data <- lapply(site_data, function(df) {
  df$date <- ymd_hms(df$date)
  return(df)
})

步骤2:定义查找最接近日期行的函数

写一个小函数,输入单个数据框和目标日期,返回最接近的那一行,同时添加地点名称方便区分:

get_closest_row <- function(df, target_date) {
  # 计算日期差的绝对值,找到最小差值的索引
  closest_idx <- which.min(abs(target_date - df$date))
  # 返回对应行并添加地点列
  result <- df[closest_idx, ]
  result$site <- deparse(substitute(df))  # 提取地点名称
  return(result)
}

步骤3:批量处理所有数据框

指定目标日期后,用lapply遍历列表中的每个数据框,应用上面的函数,最后把结果合并成一个完整的DataFrame:

# 指定目标日期
target_date <- ymd_hms("2017-09-11 15:47:35")

# 批量获取所有地点的最接近行
closest_rows_list <- lapply(site_data, function(df) {
  get_closest_row(df, target_date)
})

# 把列表结果合并成一个DataFrame
all_closest_rows <- do.call(rbind, closest_rows_list)

# 查看最终结果
print(all_closest_rows)

额外优化:用tidyverse简化操作(可选)

如果你熟悉tidyverse生态,可以用purrr和dplyr写出更简洁的代码:

library(purrr)
library(dplyr)

all_closest_rows <- site_data %>%
  imap_dfr(function(df, site_name) {
    closest_idx <- which.min(abs(target_date - df$date))
    df[closest_idx, ] %>%
      mutate(site = site_name)
  })

这样处理后,你就能一次性得到所有地点对应最接近目标日期的行,每个结果都带有地点名称,方便后续查看和分析。


内容的提问来源于stack exchange,提问作者Natalie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:12:29