假设我有一个数据框,如下所示:
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']})
Ending Date FName LName Starting Date
0 2019-12-07 Jon Doe 2019-09-28
1 2019-12-07 Bob Smith 2019-09-28
如您所见,“结束日期”列总是比“开始日期”提前10周,但是,我有一个假期列表:
holidays = pd.Series([Timestamp('2019-09-14 00:00:00'), Timestamp('2019-10-05 00:00:00'), Timestamp('2019-10-12 00:00:00'), Timestamp('2019-10-26 00:00:00'), Timestamp('2019-12-21 00:00:00'), Timestamp('2019-12-28 00:00:00'), Timestamp('2020-01-04 00:00:00'), Timestamp('2020-01-25 00:00:00'), Timestamp('2020-02-01 00:00:00'), Timestamp('2020-02-29 00:00:00'), Timestamp('2020-04-04 00:00:00'), Timestamp('2020-05-02 00:00:00')])
因此,我想“补偿”假期,因此我想获得假期系列中开始日期和结束日期之间的每个星期六的范围,并将其添加n(计数)周日期,并且,如果增加的任何一周是假期,也要对其进行补偿,依此类推...
我试过了:
df['Ending Date'] = df['Ending Date'] + pd.Timedelta(weeks=10 + pd.date_range(df['Starting Date'], df['Ending Date']).isin(holidays).sum())
但是有一个错误:
TypeError: Cannot convert input [0 2019-09-28
1 2019-09-28
Name: Starting Date, dtype: object] of type <class 'pandas.core.series.Series'> to Timestamp
被提出。
所需的输出:
Ending Date FName LName Starting Date
0 2020-01-18 Jon Doe 2019-09-28
1 2020-01-18 Bob Smith 2019-09-28
最佳答案
我假设开始日期和结束日期都应为datetime64 [ns]
类型。如果不是,请使用pd.to_datetime进行转换。
我注意到您只使用星期六的日期,所以您的情况类似于
我们有一个工作周,每个日历周只包含一个工作日,
即只有星期六。
然后,要完成您的任务,如果我们利用“自定义业务”就非常容易
日历,带有用户定义的假期日期。
首先定义CustomBusinessDay偏移量,包括您的假期列表:
my_bday = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask='Sat')
然后,计算未来n个工作日(实际上-也是几周)的日期
从给定的日期开始,我们应该使用公式:
dat + 10 * my_bday
。因此,在您的情况下(“开始日期”列中的源数据和结果
保存在“结束日期”中),运行:
df['Ending Date'] = df['Starting Date'].apply(lambda dat: dat + 10 * my_bday)
关于python - 如何补偿假期- Pandas ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58152273/