如何在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
相关产品推荐
相关产品推荐

