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

如何使自定义工作日差函数适配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:30:43