如何用Pandas实现指定日期无记录时取最近日期的股票数据?
按指定日筛选股票数据,无匹配时取当月最近日期记录
需求说明
现有存储股票记录的Pandas DataFrame,需实现:
- 传入指定日期(如8日),筛选出每年每月该日期的记录
- 若某年月的指定日期无记录,则获取该年月中存在记录的最近日期数据:
- 优先取指定日之后的最近日期(如8日无记录,先查9日、10日...)
- 若指定日后无记录,则取指定日之前的最近日期(如7日、6日...)
现有代码仅能直接筛选指定日的记录:
filtered_df = data.loc[(data['Date'].dt.day == 8)]
解决方案
步骤说明
- 确保
Date列为datetime格式(若未转换先执行转换) - 按年-月分组,对每个月的数据单独处理
- 对每个月组,判断是否存在指定日的记录:
- 存在则直接取该日数据
- 不存在则计算每条记录与指定日的天数差,优先取差值最小的正天数(即指定日后最近的日期),若无正差值则取绝对值最小的负天数(指定日前最近的日期)
完整代码实现
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
相关产品推荐
相关产品推荐

