熊猫自定义工作日偏移仅适用于某些假日

2024-05-23 22:59:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图根据一个稍微定制的日历计算未来的第5个工作日。然而,劳工节(9月美国假日)的数值计算不正确,而1月和7月(其他可能受假期影响的月份)的数值计算正确。

我已经尝试过使用^{{cd1>,但是这只会将问题从9月份的值不正确,转移到一天之内关闭一月和七月的值。

import pandas as pd
from datetime import datetime

start = datetime(2019,1,1)
end = datetime(2024,8,1)
dtrange = pd.date_range(start, end, freq='MS')
dts = pd.Series(dtrange)

hols = holidays.UnitedStates(state='MD', years=[2019,2020,2021,2022,2023,2024])
notholidays = ['American Indian Heritage Day', 'Columbus Day', 'Veterans Day']
realhols = [i for i in sorted(hols.items()) if i[1] not in notholidays]
realholsdt = [i[0] for i in realhols]

custom_bday = pd.offsets.CustomBusinessDay(holidays=realholsdt)

dts + 4 * custom_bday

预期的结果是每个月的第5个工作日,不包括周末和假期。然而,所有的劳动节假期(9月)都是假的,例如

见:2019-09-06 8

预计:2019-09-09 8


Tags: inimportdatetimeholidaysstart数值endpd
1条回答
网友
1楼 · 发布于 2024-05-23 22:59:38

您可以通过CustomBusinessMonthBegin获得当月的第一个工作日,同时计算CustomUSHolidayCalendar。在您的自定义日历中,确保您正确地抵消了劳动日(如果这是您想要的),并添加/删除任何假日。在您的date_range中使用它,方法是将它添加到freq参数中。在

import pandas as pd
from datetime import datetime, timedelta

from pandas.tseries.offsets import CustomBusinessMonthBegin, BDay
from pandas.tseries.holiday import (
    AbstractHolidayCalendar, DateOffset,
    Holiday, MO, nearest_workday,
    USLaborDay, USMemorialDay, USColumbusDay, USThanksgivingDay,
    USPresidentsDay, EasterMonday, USMartinLutherKingJr
)

class CustomUSHolidayCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('New Years Day', month=1, day=1, observance=nearest_workday),
        USMartinLutherKingJr,
        USPresidentsDay,
        USMemorialDay,
        Holiday('July 4th', month=7, day=4, observance=nearest_workday),

        # offset labor day
        Holiday('Labor Day', month=9, day=5, offset=DateOffset(weekday=MO(1))),

        # Holiday('Veterans Day', month=11, day=11, observance=nearest_workday),
        USThanksgivingDay,
        Holiday('Christmas', month=12, day=25, observance=nearest_workday),
        Holiday('Columbus Day', month=10, day=1, offset = pd.DateOffset(weekday=MO(2))),
    ]

start_date = datetime(2019, 1, 1)
end_date = datetime(2024, 8, 1)

usholidays = CustomUSHolidayCalendar()
# US Labor day as 2019-09-09

print(usholidays.holidays(start_date, datetime(2019, 12, 1)))

custom_bday_us = CustomBusinessMonthBegin(calendar=CustomUSHolidayCalendar())
bday_over_df = pd.date_range(start=start_date,
                             end=end_date,
                             freq=custom_bday_us)

最后,将第一个工作日抵消4个工作日。在

^{pr2}$

相关问题 更多 >