如何使自定义工作日差函数适配Pandas Series实现loc筛选?
计算指定日期前后7个工作日内的Value总和
原始数据
df = | index | Date | Value | |-------|------------|-------| | 1 | 12/1/2022 | 100 | | 2 | 12/2/2022 | 200 | | 3 | 12/5/2022 | 500 | | 4 | 12/6/2022 | 150 |
需求说明
需计算2022年12月12日前后7个工作日内的Value总和,已实现自然日筛选逻辑,但自定义的date_diff函数无法处理Pandas Series,需解决该问题。
解决方案
前提准备
首先确保Date列是Pandas datetime类型:
import pandas as pd from datetime import date, timedelta df['Date'] = pd.to_datetime(df['Date']) target_date = pd.to_datetime('2022-12-12')
方法1:改造自定义函数+apply遍历
保留原函数逻辑,通过apply对Series的每个元素单独调用函数:
# 定义工作日判断函数(替换你原有的check逻辑,示例排除周六日) def is_business_day(d): return d.isoweekday() not in (6, 7) def date_diff(date_1, date_2): if date_2 > date_1: delta_days = (date_2 - date_1).days start = date_1 else: delta_days = (date_1 - date_2).days start = date_2 # 生成日期范围并筛选工作日 date_range = [start + timedelta(days=i) for i in range(delta_days + 1)] business_days = [d for d in date_range if is_business_day(d)] return len(business_days) # 计算每行日期与目标日期的工作日差值 df['business_day_diff'] = df['Date'].apply(lambda x: date_diff(x, target_date)) # 筛选并求和 var = df.loc[df['business_day_diff'] <= 7, 'Value'].sum()
方法2:用Pandas内置bdate_range高效计算
避免手动循环,利用Pandas原生的工作日序列生成工具,性能更优:
def calc_business_diff(row_date, target): start = min(row_date, target) end = max(row_date, target) # bdate_range返回工作日序列,size即为工作日数量 return pd.bdate_range(start, end).size # 计算工作日差值 df['business_day_diff'] = df['Date'].apply(calc_business_diff, target=target_date) # 筛选求和 var = df.loc[df['business_day_diff'] <= 7, 'Value'].sum()
扩展:处理法定节假日
若需排除法定节假日,使用CustomBusinessDay定义自定义工作日规则:
from pandas.tseries.offsets import CustomBusinessDay # 自定义节假日列表(示例添加圣诞节) holidays = [pd.to_datetime('2022-12-25')] custom_bday = CustomBusinessDay(holidays=holidays) def calc_business_diff(row_date, target): start = min(row_date, target) end = max(row_date, target) # 计算两个日期之间的自定义工作日数 return (end - start) // custom_bday df['business_day_diff'] = df['Date'].apply(calc_business_diff, target=target_date) var = df.loc[df['business_day_diff'] <= 7, 'Value'].sum()
内容的提问来源于stack exchange,提问作者ceej pie
相关产品推荐
相关产品推荐

