R中Left-join因日期格式失败的问题排查与解决
问题分析与解决方案
核心问题排查
你遇到的left_join后结果全为NA的情况,主要来自以下几个关键问题:
1. 周度数据结构错误
从你提供的dput(head(data_test))可见,data_test的OBS列存在大量重复周度日期(前6行均为39454),但标准周度数据应该是每个周日期仅对应一行数值。这种重复行不仅会打乱匹配逻辑,还会让后续的日度展开失去意义。
2. 日期范围完全不匹配
从str()输出看,dates_master的OBS起始于2008-01-07,而data_test的OBS起始于2015-12-21。如果两个数据集的日期范围没有任何重叠,left_join后自然会全为NA。可通过以下代码验证日期交集:
intersect(dates_master$OBS, data_test$OBS)
若输出为空,说明日期完全不匹配,需检查数据来源或转换逻辑。
3. 日期转换的系统差异
janitor::excel_numeric_to_date()默认使用1900年作为Excel日期起始,但部分地区的Excel会采用1904年起始系统。如果你的CSV文件是用1904系统保存的,转换后的日期会完全错误,直接导致匹配失败。
修正后的完整代码
library(dplyr) library(janitor) # 读取周度数据并修正结构 data_test <- read.csv("C:/Users/me/Documents/monthly_and_daily_data/test.csv") # 转换日期(根据实际Excel系统选择1900或1904) data_test$OBS <- janitor::excel_numeric_to_date(data_test$OBS, date_system = "1900") # 清理重复行:每个周日期仅保留一行数据 data_test_clean <- data_test %>% distinct(OBS, .keep_all = TRUE) # 读取日期映射表并转换日期 dates_master <- read.csv("C:/Users/me/Documents/monthly_and_daily_data/dates_master.csv") dates_master$OBS <- janitor::excel_numeric_to_date(dates_master$OBS, date_system = "1900") dates_master$DailyDate <- janitor::excel_numeric_to_date(dates_master$DailyDate, date_system = "1900") # 验证日期交集(可选,用于排查) cat("两个数据集的重叠日期:\n") print(intersect(dates_master$OBS, data_test_clean$OBS)) # 执行合并并调整列名 data_test_daily <- dates_master %>% left_join(data_test_clean, by = "OBS") %>% # 调整列名,区分原周度日期和日度日期 rename(OriginalWeekDate = OBS, OBS = DailyDate) %>% select(OBS, OriginalWeekDate, column1, column2)
额外提示
- 如果
intersect输出为空,可核对CSV中的原始数字日期(如39454),用as.Date(39454, origin = "1899-12-30")手动计算Excel 1900系统对应的日期,确认转换是否正确。 - 若原周度数据是周内每日数据的集合,需先计算周度聚合值(如均值),可将
distinct替换为:data_test_clean <- data_test %>% group_by(OBS) %>% summarise(column1 = mean(column1), column2 = mean(column2))
内容的提问来源于stack exchange,提问作者PaulaCervilla
相关产品推荐
相关产品推荐

