我如何补偿假期 - pandas
How do I compensate holidays - pandas
假设我有一个数据框如下:
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')])
因此,我想 "compensate" 节假日,所以我想获取节假日系列中开始日期和结束日期之间范围内的每个星期六,并添加 n ( count) 周到结束日期,如果任何增加的周是假期,也要补偿它们,依此类推...
我试过了:
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.
我注意到你只使用星期六日期,所以你的情况类似于
我们有一个 工作周,一个日历周中只有一个工作日,
即只有星期六。
然后,如果我们利用 Custom Business 来完成您的任务,那将非常容易
日历,带有用户定义的假日日期。
从定义 CustomBusinessDay 偏移量开始,包括您的假期列表:
my_bday = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask='Sat')
然后,计算提前 n 个工作日(实际上 - 也是几周)的日期
从给定日期 dat,我们应该使用公式:dat + 10 * my_bday
.
因此在您的情况下(开始日期 列中的源数据和结果为
保存在 结束日期), 运行:
df['Ending Date'] = df['Starting Date'].apply(lambda dat: dat + 10 * my_bday)
假设我有一个数据框如下:
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')])
因此,我想 "compensate" 节假日,所以我想获取节假日系列中开始日期和结束日期之间范围内的每个星期六,并添加 n ( count) 周到结束日期,如果任何增加的周是假期,也要补偿它们,依此类推...
我试过了:
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.
我注意到你只使用星期六日期,所以你的情况类似于 我们有一个 工作周,一个日历周中只有一个工作日, 即只有星期六。
然后,如果我们利用 Custom Business 来完成您的任务,那将非常容易 日历,带有用户定义的假日日期。
从定义 CustomBusinessDay 偏移量开始,包括您的假期列表:
my_bday = pd.offsets.CustomBusinessDay(holidays=holidays, weekmask='Sat')
然后,计算提前 n 个工作日(实际上 - 也是几周)的日期
从给定日期 dat,我们应该使用公式:dat + 10 * my_bday
.
因此在您的情况下(开始日期 列中的源数据和结果为 保存在 结束日期), 运行:
df['Ending Date'] = df['Starting Date'].apply(lambda dat: dat + 10 * my_bday)