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

如何用Pandas实现指定日期无记录时取最近日期的股票数据?

按指定日筛选股票数据,无匹配时取当月最近日期记录

需求说明

现有存储股票记录的Pandas DataFrame,需实现:

  • 传入指定日期(如8日),筛选出每年每月该日期的记录
  • 若某年月的指定日期无记录,则获取该年月中存在记录的最近日期数据:
    • 优先取指定日之后的最近日期(如8日无记录,先查9日、10日...)
    • 若指定日后无记录,则取指定日之前的最近日期(如7日、6日...)

现有代码仅能直接筛选指定日的记录:

filtered_df = data.loc[(data['Date'].dt.day == 8)] 

解决方案

步骤说明

  1. 确保Date列为datetime格式(若未转换先执行转换)
  2. 按年-月分组,对每个月的数据单独处理
  3. 对每个月组,判断是否存在指定日的记录:
    • 存在则直接取该日数据
    • 不存在则计算每条记录与指定日的天数差,优先取差值最小的正天数(即指定日后最近的日期),若无正差值则取绝对值最小的负天数(指定日前最近的日期)

完整代码实现

import pandas as pd

def get_target_or_closest(df, target_day):
    # 确保Date是datetime类型
    df['Date'] = pd.to_datetime(df['Date'])
    
    # 按年-月分组
    grouped = df.groupby([df['Date'].dt.year, df['Date'].dt.month])
    
    result = []
    for (year, month), group in grouped:
        # 检查当月是否有target_day的记录
        target_mask = group['Date'].dt.day == target_day
        if target_mask.any():
            result.append(group[target_mask])
        else:
            # 计算每条记录与target_day的天数差
            group['day_diff'] = group['Date'].dt.day - target_day
            # 排序规则:先按day_diff的绝对值升序,再按day_diff降序(正差值优先)
            sorted_group = group.sort_values(by=['day_diff', 'day_diff'], key=lambda x: (x.abs(), -x))
            # 取最近的一条记录
            result.append(sorted_group.iloc[[0]])
    
    # 合并结果并按日期排序,移除临时计算列
    final_df = pd.concat(result).drop('day_diff', axis=1).sort_values('Date')
    return final_df

# 使用示例:传入你的DataFrame和目标日(如8)
filtered_df = get_target_or_closest(data, target_day=8)

代码说明

  • pd.to_datetime(df['Date']):统一日期格式,避免后续调用dt属性时出错
  • 分组键[df['Date'].dt.year, df['Date'].dt.month]:将数据拆分为单个自然月的组,保证每个组独立处理
  • 天数差排序逻辑:通过绝对值排序找到最近日期,同时让正差值(指定日后的日期)排在前面,满足需求中"优先取较晚日期"的规则
  • 最终合并结果并按日期排序,保证输出数据的时序性

内容的提问来源于stack exchange,提问作者Muhammad Haris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:31:10