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

如何在Pandas中组合复杂周期?以每月第3周周五为例

如何在Pandas中生成“每月第3周的周五”这类复合周期

嘿,这个需求在Pandas里完全能搞定,我给你两种实用的实现思路,你可以根据自己对“第3周”的定义来选:

方法1:直接获取每月的第3个周五(最稳妥)

如果你的需求本质是每月第3个周五(不管周的具体划分逻辑,只要是当月的第三个周五就行),这个方法最靠谱:

import pandas as pd

# 生成目标时间段内每个月的第一天
month_starts = pd.date_range(start='2023-01-01', end='2024-12-31', freq='MS')

# 定义函数:输入每月第一天,返回该月第3个周五
def get_third_friday(month_start):
    # 生成该月所有周五的日期序列
    month_end = month_start + pd.offsets.MonthEnd(1)
    fridays_in_month = pd.date_range(start=month_start, end=month_end, freq='W-FRI')
    # 取第三个周五(索引从0开始,所以是[2])
    return fridays_in_month[2]

# 对每个月第一天应用函数,得到最终结果
third_fridays = month_starts.to_series().apply(get_third_friday)
print(third_fridays)

这个方法的好处是不会出边界错误——每个月至少有4个周五,所以第三个周五一定存在。

方法2:按自然月周划分筛选(精准匹配“第3周”)

如果你的“第3周”是指自然月内的第3个7天周期(比如1-7号是第1周,8-14号第2周,15-21号第3周),那可以用日期筛选的方式:

import pandas as pd

# 生成目标时间段内的所有日期
all_dates = pd.date_range(start='2023-01-01', end='2024-12-31', freq='D')

# 转换成DataFrame方便添加筛选条件
df = pd.DataFrame({'date': all_dates})
# 标记是否为周五:0=周一,4=周五
df['is_friday'] = df['date'].dt.weekday == 4
# 计算日期在当月的自然周数:(日期-1)//7 +1 实现自然月内的周划分
df['month_week'] = (df['date'].dt.day - 1) // 7 + 1

# 筛选出周五且是当月第3周的日期
third_week_fridays = df[(df['is_friday']) & (df['month_week'] == 3)]['date']
print(third_week_fridays)

注意:这种划分和ISO标准周不同,如果当月1号不是周一,周的起始会和自然月对齐(比如1号是周六,那1-2号算第1周,3-9号算第2周)。

小提示

如果需要ISO标准的周(周一到周日,每年第一周包含至少4天),可以用df['date'].dt.isocalendar().week获取ISO周数,再结合月份筛选,但要注意ISO周可能跨月,需要额外处理跨月的情况。

内容的提问来源于stack exchange,提问作者jab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:00:53