Python Pandas筛选澳股每月第15交易日代码失效问题求助
问题说明
Sheet1包含澳大利亚股市10年交易日数据,需求是保留每月第15个交易日(不一定是当月15号),但现有代码仅能筛选出前12个月的数据,后续年份无法正常过滤。
原代码
df = pd.read_csv(r'C:\Users\\Desktop\Sheet1.csv') df['Date'] = pd.to_datetime(df['Date']) df['month'] = df['Date'].dt.month df['trading_day'] = df.groupby(['month']).cumcount() + 1 df = df[df['trading_day'] == 15] df.drop(['month', 'trading_day'], axis=1, inplace=True) df.to_excel("Sheet2.xlsx", index=False)
当前输出
Date NAV 2009-06-22 00:00:00 $50.7731 2009-07-21 00:00:00 $52.2194 2009-08-21 00:00:00 $55.5233 2009-09-21 00:00:00 $61.1116 2009-10-21 00:00:00 $62.6512 2009-11-20 00:00:00 $60.9736 2009-12-21 00:00:00 $60.2841 2010-01-22 00:00:00 $61.2418 2010-02-19 00:00:00 $59.8768 2010-03-19 00:00:00 $63.4521 2010-04-23 00:00:00 $63.1672 2010-05-21 00:00:00 $55.8651
问题根源
原代码仅按month(月份)分组计算交易日序号,导致不同年份的同一月份会被合并计数。比如2009年1月和2010年1月的交易日会被放在同一组累计,后续年份的第15个交易日永远无法被筛选到,因为累计计数早已超过15。
修正方案
需要按年份+月份组合分组,确保每个年月的交易日序号独立计数:
import pandas as pd df = pd.read_csv(r'C:\Users\\Desktop\Sheet1.csv') df['Date'] = pd.to_datetime(df['Date']) # 按年份和月份组合分组,计算每月内的交易日序号 df['trading_day'] = df.groupby([df['Date'].dt.year, df['Date'].dt.month]).cumcount() + 1 # 筛选每月第15个交易日 df = df[df['trading_day'] == 15] df.drop(['trading_day'], axis=1, inplace=True) df.to_excel("Sheet2.xlsx", index=False)
说明
- 分组键改用
dt.year和dt.month的组合,保证每个自然月的交易日计数从1开始重新累加 - 移除了多余的
month列,直接通过日期属性分组更简洁 - 该代码可处理所有年份的月度第15交易日筛选,覆盖10年数据需求
内容的提问来源于stack exchange,提问作者onthepunt
相关产品推荐
相关产品推荐

