在R/Python中为匹配日期追加对应值至数据框并生成文本文件
解决方案:R 和 Python 实现日期匹配与值填充
R 实现步骤
生成目标日期序列
先创建你需要的15天间隔日期序列,并转为数据框:# 生成15天频率日期序列 dates <- seq(as.Date("2017-01-01"), as.Date("2020-12-30"), by = 15) # 转为数据框,方便后续操作 target_df <- data.frame(target_date = dates)合并观测日期与值数据
假设你的观测日期数据框为obs_dates_df(包含var_name变量名、obs_date观测日期列),值数据框为values_df(包含var_name、obs_value对应值列),先将两者合并:obs_combined <- merge(obs_dates_df, values_df, by = "var_name")匹配日期并填充缺失值
使用dplyr包完成全维度匹配,无观测的日期自动填充NA(R中NA等价于NaN):# 如果未安装dplyr,先执行 install.packages("dplyr") library(dplyr) # 获取所有唯一变量名,扩展目标日期与变量的笛卡尔积 vars <- unique(obs_combined$var_name) target_expanded <- expand.grid(target_date = dates, var_name = vars) # 左连接匹配,填充缺失值 final_df <- target_expanded %>% left_join(obs_combined, by = c("target_date" = "obs_date", "var_name")) %>% rename(value = obs_value)保存为文本文件
将结果保存为制表符分隔的文本文件,缺失值显示为NaN:write.table(final_df, "matched_data.txt", sep = "\t", row.names = FALSE, na = "NaN")
Python 实现步骤
依赖pandas和numpy库,未安装的话先执行pip install pandas numpy。
生成目标日期序列
用pandas创建15天间隔的日期序列:import pandas as pd import numpy as np # 生成15天频率日期序列 dates = pd.date_range(start="2017-01-01", end="2020-12-30", freq="15D") target_df = pd.DataFrame({"target_date": dates})合并观测日期与值数据
假设观测日期数据框obs_dates_df(列:var_name,obs_date),值数据框values_df(列:var_name,obs_value),合并并统一日期格式:obs_combined = pd.merge(obs_dates_df, values_df, on="var_name") # 确保观测日期为datetime类型 obs_combined["obs_date"] = pd.to_datetime(obs_combined["obs_date"])匹配日期并填充NaN
扩展目标日期到所有变量维度,左连接匹配后填充缺失值:# 获取所有唯一变量名 vars = obs_combined["var_name"].unique() # 生成目标日期与变量的笛卡尔积 target_expanded = target_df.assign(key=1).merge( pd.DataFrame({"var_name": vars, "key": 1}), on="key" ).drop("key", axis=1) # 左连接匹配,自动填充NaN final_df = pd.merge( target_expanded, obs_combined, left_on=["target_date", "var_name"], right_on=["obs_date", "var_name"], how="left" ).drop("obs_date", axis=1).rename(columns={"obs_value": "value"})保存为文本文件
将结果保存为制表符分隔的文本文件,缺失值显示为NaN:final_df.to_csv("matched_data.txt", sep="\t", index=False, na_rep="NaN")
内容的提问来源于stack exchange,提问作者kl40
相关产品推荐
相关产品推荐

