gpt4 book ai didi

pandas - 将工作日添加到带有日期的 Pandas 数据框并跳过假期python

转载 作者:行者123 更新时间:2023-12-04 08:07:31 24 4
gpt4 key购买 nike

我有一个带有日期的数据框,如下表所示。第一个 block 是它应该看起来的样子,第二个 block 是我在添加 BDay 时得到的。这是完成后应该是什么样子的示例。我想使用第一列并在日期中添加 5 个工作日,但如果 5 个 Bdays 与假期重叠(例如 21 年 2 月 15 日),那么我需要再添加一天。使用 pandas.tseries.offsets import BDay 添加 5Bday 相当简单。 ,但我不能在使用数据框时跳过假期。
我尝试使用 pandas.tseries.holiday import USFederalHolidayCalendar ,工作日和工作日历模块,但无法弄清楚。任何人都知道我能做什么。
正确的例子


日期
退出日期 +5


2021/02/09
2021/02/17

2021/02/10
2021/02/18


错误的例子


日期
退出日期 +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)

最佳答案

输入数据

df = pd.DataFrame(['2021-02-09', '2021-02-10', '2021-06-28', '2021-06-29', '2021-07-02'], columns=['DATE'])
df['DATE'] = pd.to_datetime(df['DATE'])
使用 apply 的建议解决方案
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import BDay

def offset_date(start, offset):
return start + pd.offsets.CustomBusinessDay(n=offset, calendar=USFederalHolidayCalendar())

offset = 5
df['END'] = df.apply(lambda x: offset_date(x['DATE'], offset), axis=1)

DATE END
2021-02-09 2021-02-17
2021-02-10 2021-02-18
2021-06-28 2021-07-06
2021-06-29 2021-07-07
2021-07-02 2021-07-12
PS:如果你想使用特定的日历,比如 NYSE,而不是默认的 USFederalHolidayCalendar , 我建议按照 this answer 上的说明进行操作,关于创建自定义日历。
我不推荐的替代解决方案
目前,据我所知,pandas 不支持矢量化方法来解决您的问题。但是,如果您想遵循与您提到的方法类似的方法,那么您应该这样做。
首先,您必须定义一个任意远的 end包含您可能需要的所有期间的日期,并使用它来创建假期列表。
holidays = USFederalHolidayCalendar().holidays(start='2021-02-09', end='2030-02-09')
然后,您通过 holidays通过 holidays 列出到 CustomBusinessDay参数而不是 calendar生成所需的偏移量。
offset = 5
bday_us = pd.offsets.CustomBusinessDay(n=offset, holidays=holidays)
df['END'] = df['DATE'] + bday_us
但是, 这种方法不是真正的矢量化解决方案 ,即使它看起来像。见下文 SO answer进一步澄清。在引擎盖下,这种方法可能正在执行一种效率不高的转换。这就是它产生以下警告的原因。

PerformanceWarning: Non-vectorized DateOffset being applied to Seriesor DatetimeIndex

关于pandas - 将工作日添加到带有日期的 Pandas 数据框并跳过假期python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66150087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com