如何实现DataFrame日期匹配并填充最近日期的adjusted_close值?
解决DataFrame日期匹配并填充最近价格的方案
问题分析
你之前的代码存在几个核心问题:
- 嵌套循环效率极低,且用日期直接索引
prices_matched_df['price']是错误操作(该DataFrame的行索引是默认数字序列,而非日期) - 未定义变量
dt,会直接导致代码报错 - 左连接的方法仅匹配了完全重合的日期,缺失值未按「最近日期」规则填充
最优解决方案(简洁高效)
利用pandas原生的reindex方法,指定method='nearest'即可快速完成日期匹配与最近值填充,步骤如下:
- 统一日期格式为datetime类型(避免类型不匹配导致的匹配失败):
import pandas as pd # 转换revenue的filing_date列为datetime类型 revenue['filing_date'] = pd.to_datetime(revenue['filing_date']) # 转换prices_df的索引为datetime类型 prices_df.index = pd.to_datetime(prices_df.index)
- 生成目标DataFrame:
# 用reindex匹配filing_date,自动取最近日期的adjusted_close值 matched_prices = prices_df['adjusted_close'].reindex(revenue['filing_date'], method='nearest') # 构建最终的prices_matched_df prices_matched_df = pd.DataFrame({ 'date': revenue['filing_date'], 'price': matched_prices.values })
基于你左连接思路的改进方案
如果想沿用之前的左连接逻辑,可在连接后对缺失值进行填充:
# 左连接获取完全匹配的价格值 price_matched_df = revenue[['filing_date']].merge( prices_df.reset_index().rename(columns={'index': 'date', 'adjusted_close': 'price'}), left_on='filing_date', right_on='date', how='left' ).drop(columns='date').rename(columns={'filing_date': 'date'}) # 定义函数获取目标日期对应的最近价格 def get_nearest_price(target_date): # 找到最近日期在prices_df索引中的位置 nearest_pos = prices_df.index.get_loc(target_date, method='nearest') return prices_df['adjusted_close'].iloc[nearest_pos] # 填充缺失的price值 price_matched_df['price'] = price_matched_df.apply( lambda row: get_nearest_price(row['date']) if pd.isna(row['price']) else row['price'], axis=1 )
说明
- 第一种方案利用pandas原生方法,无需手动循环,效率远高于嵌套循环,且代码简洁易维护
- 两种方案最终都会生成包含41行、
date和price两列的DataFrame,完全符合需求
内容的提问来源于stack exchange,提问作者Pseudodifferential Operators
相关产品推荐
相关产品推荐

