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

如何实现DataFrame日期匹配并填充最近日期的adjusted_close值?

解决DataFrame日期匹配并填充最近价格的方案

问题分析

你之前的代码存在几个核心问题:

  • 嵌套循环效率极低,且用日期直接索引prices_matched_df['price']是错误操作(该DataFrame的行索引是默认数字序列,而非日期)
  • 未定义变量dt,会直接导致代码报错
  • 左连接的方法仅匹配了完全重合的日期,缺失值未按「最近日期」规则填充

最优解决方案(简洁高效)

利用pandas原生的reindex方法,指定method='nearest'即可快速完成日期匹配与最近值填充,步骤如下:

  1. 统一日期格式为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)
  1. 生成目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:31:15