如何用Pandas筛选DataFrame中每月最后一个工作日的数据
筛选Pandas DataFrame中每月最后一个工作日的记录
核心思路
用Pandas内置的BMonthEnd日期偏移量,直接计算每条记录所属月份的最后一个工作日,再筛选出日期与该值完全匹配的行即可。
具体操作步骤
确保日期列格式正确
如果你的date列还不是datetime64类型,先做转换:df['date'] = pd.to_datetime(df['date'])添加当月最后工作日列
利用BMonthEnd(0)把每个日期调整到其所在月份的最后一个工作日,生成新列:from pandas.tseries.offsets import BMonthEnd df['month_last_bday'] = df['date'] + BMonthEnd(0)筛选目标记录
只保留date和month_last_bday相等的行,最后可以删掉辅助列:filtered_df = df[df['date'] == df['month_last_bday']].drop(columns='month_last_bday')
示例验证
拿你提到的2022年7、8月数据测试:
import pandas as pd from pandas.tseries.offsets import BMonthEnd # 构造测试数据 sample_data = { 'date': ['2022-07-25', '2022-07-29', '2022-08-28', '2022-08-31', '2022-09-02'], 'data_col': [1, 2, 3, 4, 5] } df = pd.DataFrame(sample_data) df['date'] = pd.to_datetime(df['date']) # 执行筛选 df['month_last_bday'] = df['date'] + BMonthEnd(0) filtered_df = df[df['date'] == df['month_last_bday']].drop(columns='month_last_bday') print(filtered_df)
输出结果:
date data_col 1 2022-07-29 2 3 2022-08-31 4
完全符合预期。
额外说明
- 如果某月份的最后工作日在你的数据里没有对应记录,该月份不会出现在结果中
- 默认
BMonthEnd遵循美国节假日规则,要是需要适配国内或其他地区的工作日,可结合pandas.tseries.holiday自定义节假日日历
内容的提问来源于stack exchange,提问作者darkuss
相关产品推荐
相关产品推荐

