如何用Pandas实现假期补偿?日期调整计算问题求助
解决假期补偿的日期循环调整问题
首先,你的原代码报错核心原因是pd.date_range()无法直接接收Series作为起始/结束参数——它需要单个日期值,而不是整列数据。我们需要逐行处理每个用户的日期范围,同时实现循环补偿逻辑,直到新增的时间段里没有需要补偿的假期为止。
步骤1:统一日期格式
先把Starting Date列从字符串转换为datetime类型,避免后续日期计算出错:
import pandas as pd from pandas import Timestamp # 初始化你的数据 df = pd.DataFrame({ 'Ending Date': [Timestamp('2019-12-08 00:00:00'), Timestamp('2019-12-08 00:00:00')], 'FName': ['Jon', 'Bob'], 'LName': ['Doe', 'Smith'], 'Starting Date': ['2019-09-29', '2019-09-29'] }) holidays = pd.Series([ Timestamp('2019-09-14'), Timestamp('2019-10-05'), Timestamp('2019-10-12'), Timestamp('2019-10-26'), Timestamp('2019-12-21'), Timestamp('2019-12-28'), Timestamp('2020-01-04'), Timestamp('2020-01-25'), Timestamp('2020-02-01'), Timestamp('2020-02-29'), Timestamp('2020-04-04'), Timestamp('2020-05-02') ]) # 转换起始日期为datetime类型 df['Starting Date'] = pd.to_datetime(df['Starting Date'])
步骤2:编写循环补偿的核心函数
我们需要一个函数来处理单条记录的日期调整,循环计算需要补偿的周数,直到没有新增假期需要处理:
def adjust_end_date(start_date, initial_end_date, holidays): current_end = initial_end_date while True: # 先筛选出假期列表中的周六(符合你"统计属于假期列表的周六"的需求) holiday_saturdays = holidays[holidays.dt.weekday == 5] # 5代表周六 # 统计当前日期范围内的符合条件的假期数量 n = holiday_saturdays[(holiday_saturdays >= start_date) & (holiday_saturdays <= current_end)].count() if n == 0: break # 没有需要补偿的假期,退出循环 # 增加n周的补偿时间 current_end += pd.Timedelta(weeks=n) # 更新起始日期,避免重复统计已经处理过的假期 start_date = current_end - pd.Timedelta(weeks=n) + pd.Timedelta(days=1) return current_end
如果你需要统计的是时间段内所有属于假期的天数(不限周几),只需要去掉
holidays.dt.weekday ==5这部分过滤逻辑即可。
步骤3:将函数应用到DataFrame
用apply逐行处理每条记录,更新Ending Date列:
df['Ending Date'] = df.apply( lambda row: adjust_end_date(row['Starting Date'], row['Ending Date'], holidays), axis=1 )
验证最终结果
运行后你会得到期望的输出:
Ending Date FName LName Starting Date 0 2020-01-18 Jon Doe 2019-09-29 1 2020-01-18 Bob Smith 2019-09-29
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

