Python 我如何补偿假期-熊猫
假设我有一个数据框,如下所示:Python 我如何补偿假期-熊猫,python,pandas,datetime,date-range,Python,Pandas,Datetime,Date Range,假设我有一个数据框,如下所示: 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']}) 如您所见,结束日期列总是比开始日期提前10周,但是,我有
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']})
如您所见,结束日期列总是比开始日期提前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
我假设开始日期和结束日期都应该是datetime64[ns]
类型。如果不是,请将它们与pd.to_datetime一起转换
我注意到你只使用星期六的日期,所以你的案例是这样的
我们有一个工作周,一个日历周只有一个工作日,
那只是星期六
然后,为了完成您的任务,如果我们利用定制业务,这是非常容易的
日历,带有用户定义的假日日期
从定义CustomBusinessDay偏移开始,包括您的假日列表:
my_bday = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask='Sat')
然后,计算提前n个工作日(实际上也是数周)的日期
从给定的日期dat开始,我们应该使用公式:dat+10*my_bday
因此,在您的情况下(起始日期列中的源数据和要显示的结果)
保存在结束日期),运行:
这里的预期输出是什么?你能在
pandas
(请参阅)中使用工作日计算而不是自己进行计算吗?@jezrael你能找到答案吗?@jezrael让我向你展示循环,从9月28日开始的10周是12月7日,但在范围内,它包含三个假期,所以结束日期应该延长3周,然后是12月28日,但范围内还有两个新的假期,所以结束日期应该延长两周,1月11日,然后再增加一个假期,再加上一周就是1月18日,明白了吗?@jezrael 60岁左右,我不介意演出
Ending Date FName LName Starting Date
0 2020-01-18 Jon Doe 2019-09-28
1 2020-01-18 Bob Smith 2019-09-28
my_bday = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask='Sat')
df['Ending Date'] = df['Starting Date'].apply(lambda dat: dat + 10 * my_bday)