如何用Pandas Datetime为到期日期匹配对应月度第三个周五?
解决方案:为到期日期匹配正确的月度第三个周五
核心思路是直接计算每个日期对应的目标第三个周五,而非依赖现有数据中筛选出的记录(现有数据缺失部分月份的第三个周五,导致匹配失效)。通过Pandas的日期偏移量工具,可以精准计算任意月份的第三个周五,再根据到期日期与当月第三个周五的关系,返回正确的目标日期。
完整代码
import pandas as pd def get_third_friday(date): # 获取当月第一天 first_day = date.replace(day=1) # 计算当月第三个周五:WeekOfMonth的week参数为0-indexed,week=2对应第三周;weekday=4对应周五 return first_day + pd.offsets.WeekOfMonth(week=2, weekday=4) def get_target_third_friday(exp_date): current_month_third_fri = get_third_friday(exp_date) if exp_date <= current_month_third_fri: return current_month_third_fri else: # 计算下月的第三个周五 next_month_date = exp_date + pd.DateOffset(months=1) return get_third_friday(next_month_date) # 原始数据 x = ['09/23/2022','09/26/2022','09/28/2022','09/30/2022','10/3/2022','10/5/2022', '10/7/2022','10/10/2022','10/12/2022','10/14/2022','10/17/2022','10/19/2022','10/21/2022', '10/24/2022','10/26/2022','10/28/2022','11/4/2022','11/18/2022','12/16/2022','12/30/2022', '01/20/2023','03/17/2023','03/31/2023','06/16/2023','06/30/2023','09/15/2023','12/15/2023', '01/19/2024','06/21/2024','12/20/2024','01/17/2025'] # 构造DataFrame并处理日期格式 df = pd.DataFrame(x, columns=['expiration_date']) df['expiration_date'] = pd.to_datetime(df['expiration_date']) # 生成目标月度第三个周五列 df['monthly_exp'] = df['expiration_date'].apply(get_target_third_friday) # 可选:保留原有的is_third_friday列用于验证 def is_third_friday(d): return d.weekday() == 4 and 15 <= d.day <= 21 df['is_third_friday'] = df['expiration_date'].apply(is_third_friday) # 输出到CSV df.to_csv('C:/Data/Date Dataframe.csv', index=False)
关键步骤说明
get_third_friday函数:- 获取输入日期所在月份的第一天,利用
pd.offsets.WeekOfMonth偏移量直接计算该月的第三个周五。其中week=2是因为参数为0-indexed(0对应第一周,2对应第三周),weekday=4对应周五(周一为0,周日为6)。 - 此方法不依赖任何现有数据,无论目标月份的第三个周五是否在原始数据中,都能准确计算。
- 获取输入日期所在月份的第一天,利用
get_target_third_friday函数:- 先计算当前月份的第三个周五,若到期日期早于或等于该日期,则返回当月第三个周五;
- 若到期日期晚于当月第三个周五,则计算下月的第三个周五并返回。
应用到DataFrame:
- 通过
apply方法将get_target_third_friday函数作用于每个到期日期,生成monthly_exp列,即为每个日期匹配的正确目标周五。
- 通过
内容的提问来源于stack exchange,提问作者user1470034
相关产品推荐
相关产品推荐

