如何在Pandas日期范围内高效查找每月第N个特定工作日的日期?
高效查找Pandas DataFrame中每月第N个特定工作日的方法
针对你的需求,推荐两种无需循环的高效实现方式,利用Pandas的矢量化操作和内置功能,性能远超遍历方法:
方法一:直接生成目标日期序列(最简洁高效)
Pandas支持WOM(Week Of Month)类型的频率字符串,可以直接生成每月第N个指定工作日的日期序列,再和原DataFrame匹配即可。
比如要查找每月第三个周二,代码如下:
import pandas as pd # 原DataFrame生成代码 date_rng = pd.date_range(start='1/1/2020', end='12/31/2023', freq='D') df = pd.DataFrame(date_rng, columns=['date']) # 定义目标规则:每月第三个周二(WOM-3TUE,3表示第3个,TUE表示周二) target_freq = 'WOM-3TUE' # 生成覆盖原DataFrame时间范围的目标日期 target_dates = pd.date_range(start=df['date'].min(), end=df['date'].max(), freq=target_freq) # 筛选原DataFrame中匹配的日期行 result = df[df['date'].isin(target_dates)]
频率字符串规则说明:
WOM-NX:N是第几个(1-4),X是工作日缩写(MON/TUE/WED/THU/FRI/SAT/SUN)- 例如
WOM-1MON是每月第一个周一,WOM-4FRI是每月第四个周五
方法二:分组筛选(更灵活)
如果需要动态指定N值和工作日(比如允许用户输入参数),可以按年月分组后筛选每组内的第N个目标工作日:
def get_nth_weekday(df, n, weekday_code): """ 获取每月第n个指定工作日的行 :param df: 包含date列的DataFrame :param n: 第几个(如3表示第三个) :param weekday_code: 工作日编码,0=周一,1=周二,...,6=周日 """ # 添加年月周期列和星期编码列(临时辅助列) df_temp = df.assign( year_month=df['date'].dt.to_period('M'), weekday=df['date'].dt.weekday ) # 先筛选出目标星期的所有日期 filtered = df_temp[df_temp['weekday'] == weekday_code] # 按年月分组,取每组的第n-1个元素(索引从0开始) result = filtered.groupby('year_month').nth(n-1).reset_index(drop=True) # 删除临时辅助列 return result.drop(columns=['year_month', 'weekday']) # 调用示例:查找2020-2023年间每月第三个周二(n=3,周二对应编码1) result = get_nth_weekday(df, 3, 1)
性能说明
两种方法均基于Pandas的矢量化操作和内部优化逻辑,时间复杂度远低于循环遍历,即使处理数年的日度数据也能快速完成。其中方法一的性能最优,因为直接利用了Pandas的日期生成机制,无需额外分组计算。
内容的提问来源于stack exchange,提问作者AlanGhalan
相关产品推荐
相关产品推荐

