我有一个数据框,其中包含如下表格中所示的日期。第1个块是应该看起来的样子,第2个块是我仅添加BDays时得到的结果。这是一个完成后应该看起来的例子。我想使用第一列,并在日期上加上5个工作日,但如果5个Bday重叠假期(例如21年2月15日),那么我需要再加上一天。使用
我尝试使用
正确的例子
日期 EXIT DATE +5
2021/02/09 2021/02/17 2021/02/10 2021/02/18
错误的例子
日期 EXIT DATE +5
2021/02/09 2021/02/16 2021/02/10 2021/02/17
以下是我尝试的一些代码示例:
pandas.tseries.offsets import BDay
很容易添加5个Bday,但是在使用数据框时无法跳过节假日。我尝试使用
pandas.tseries.holiday import USFederalHolidayCalendar
、workdays 和 workalendar 模块,但无法弄清楚。有人知道我该怎么做吗?正确的例子
日期 EXIT DATE +5
2021/02/09 2021/02/17 2021/02/10 2021/02/18
错误的例子
日期 EXIT DATE +5
2021/02/09 2021/02/16 2021/02/10 2021/02/17
以下是我尝试的一些代码示例:
import pandas as pd
from workdays import workday
...
df['DATE'] = workday(df['EXIT DATE +5'], days=5, holidays=holidays)
下一个例子:
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
bday_us = pd.offsets.CustomBusinessDay(calendar=USFederalHolidayCalendar())
dt = df['DATE']
df['EXIT DATE +5'] = dt + bday_us
=========================================
最终代码:
以下是我最终选择的代码。由于纽约证交所实际交易的日期,例如总统布什去世的那一天,我不得不手动定义节假日。
import datetime as dt
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import BDay
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \
USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \
USLaborDay, USThanksgivingDay
class USTradingCalendar(AbstractHolidayCalendar):
rules = [
Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday),
USMartinLutherKingJr,
USPresidentsDay,
GoodFriday,
USMemorialDay,
Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday),
Holiday('BushDay', year=2018, month=12, day=5),
USLaborDay,
USThanksgivingDay,
Holiday('Christmas', month=12, day=25, observance=nearest_workday)
]
offset = 5
df = pd.DataFrame(['2019-10-11', '2019-10-14', '2017-04-13', '2018-11-28', '2021-07-02'], columns=['DATE'])
df['DATE'] = pd.to_datetime(df['DATE'])
def offset_date(start, offset):
return start + pd.offsets.CustomBusinessDay(n=offset, calendar=USTradingCalendar())
df['END'] = df.apply(lambda x: offset_date(x['DATE'], offset), axis=1)
print(df)
Holiday('六月节日', month=6, day=19, observance=nearest_workday),