如何按PERMNO分组保留每第5个交易日的股票观测数据?
解决方案:按股票分组筛选每第5个交易日数据
你的核心问题是用resample('5D')是按日历时间间隔采样,而不是按每个股票自身的交易日数量计数,所以无法满足需求。正确的做法是对每个股票的交易日序列单独计数,筛选出第5、10、15...个交易日(从1开始计数)。
具体代码实现
import pandas as pd # 确保date列是datetime类型(如果尚未转换) crsp_daily['date'] = pd.to_datetime(crsp_daily['date']) # 按股票代码分组,组内按日期排序,生成组内交易日序号(从0开始) crsp_daily = crsp_daily.sort_values(['PERMNO', 'date']) crsp_daily['trade_day_seq'] = crsp_daily.groupby('PERMNO').cumcount() # 筛选每第5个交易日(序号从0开始,第5个对应序号4,第10个对应序号9,以此类推) filtered_df = crsp_daily[crsp_daily['trade_day_seq'] % 5 == 4].drop('trade_day_seq', axis=1) # 查看结果 print(filtered_df)
代码说明
- 日期格式转换:先确保
date列是datetime类型,保证排序和分组的正确性。 - 组内排序与计数:按
PERMNO分组后,用cumcount()生成每个股票内部的交易日序号,序号从0开始递增,对应每个股票的交易日顺序。 - 筛选目标行:通过
trade_day_seq %5 ==4筛选出每第5个交易日的记录(从1开始计数的第5、10、15...个交易日),最后删除辅助列得到结果。
为什么resample('5D')不适用
resample('5D')是基于固定日历时间间隔的采样,会把所有股票的时间轴统一按5天分割,完全忽略不同股票的交易日差异(比如有的股票某天停牌无数据),也无法准确对应“第5个交易日”的需求,因此得到的Resampler对象无法直接生成你需要的结果。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

