不同长度时间间隔的R语言DataFrame按DateTime15合并问题求助
问题分析与解决方案
核心问题排查
你遇到的left_join全出NA、merge生成额外行的问题,大概率是两个DataFrame的DateTime15字段类型/格式不匹配——比如一个是字符串、一个是POSIX时间对象,或者时区不一致,导致系统识别不出是同一时间,自然匹配失败。
分步解决方法
1. 统一时间字段的类型与时区
先把两个表的DateTime15都转成标准的POSIXct时间对象,确保时区一致(这里用UTC做示例,你可以换成自己数据的时区):
# 转换df1的DateTime15,根据你的实际时间格式调整format参数 df1$DateTime15 <- as.POSIXct(df1$DateTime15, format = "%Y-%m-%d %H:%M:%S", tz = "UTC") # 转换df2的DateTime15,格式要和df1对应 df2$DateTime15 <- as.POSIXct(df2$DateTime15, format = "%Y-%m-%d %H:%M:%S", tz = "UTC")
比如你的时间是05/20/2024 08这种格式,format就改成%m/%d/%Y %H。
2. 把df1的15分钟级时间对齐到小时
如果df1是15分钟间隔(比如2024-05-20 08:15:00),而df2是整小时数据(比如2024-05-20 08:00:00),得先把df1的时间向下取整到小时,才能和df2匹配:
# 先安装加载lubridate包 install.packages("lubridate") library(lubridate) # 给df1添加整小时时间字段 df1$DateTime_Hour <- floor_date(df1$DateTime15, unit = "hour") # df2也同步处理,确保时间基准一致 df2$DateTime_Hour <- floor_date(df2$DateTime15, unit = "hour")
3. 执行左连接(保留df1所有行)
用dplyr的left_join,基于统一后的小时字段匹配,只取df2里的降雨数据:
install.packages("dplyr") library(dplyr) result_df <- df1 %>% left_join(df2 %>% select(DateTime_Hour, Hourly_Rainfall_mm), by = "DateTime_Hour") # 不需要中间字段的话可以删掉 result_df <- result_df %>% select(-DateTime_Hour)
4. Base R替代方案
如果不想用dplyr,用base R的merge也能实现,注意指定all.x = TRUE只保留df1的行:
# 先完成步骤1、2的时间统一 result_df <- merge(df1, df2[, c("DateTime_Hour", "Hourly_Rainfall_mm")], by = "DateTime_Hour", all.x = TRUE)
常见错误修正
- 指定
by.x/by.y报错:检查字段名拼写,或者有没有重复字段名导致冲突,尽量用select先筛选出需要的字段再连接 merge出现额外行:别用all=TRUE,改成all.x=TRUE就只会保留df1的所有行,不会新增df2独有的记录
内容的提问来源于stack exchange,提问作者LZ24AP
相关产品推荐
相关产品推荐

