You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:10:17