计算Pandas的工资天数

时间:2017-09-26 12:24:20

标签: python pandas time-series

我创建了一个自定义日历:

holidays_list = [...]  # list of all weekends and holidays for needed time period

class MyBusinessCalendar(AbstractHolidayCalendar):
    start_date = datetime(2011, 1, 1)
    end_date = datetime(2017, 12, 31)
    rules = [
        Holiday(name='Day Off', year=d.year, month=d.month, day=d.day) for d in holidays_list
    ]

cal = MyBusinessCalendar()

我知道工资日是每个月的第5天和第20天,或者是前几个工作日,如果这些工作日休假的话。 因此,我采取

bus_day = CustomBusinessDay(calendar=cal)
r = pd.date_range('2011-01-01', '2017-12-31', freq=bus_day)

我想从r计算每天的工资日。我怎么能得到这个?

1 个答案:

答案 0 :(得分:2)

工资日列表(美式英语发薪日)由您定义为:

  

每个月的第5天和第20天或之前的工作日(如果这些都是休息日)

要使用假日日历以编程方式生成发薪日列表,您可以生成每月的第6个月和每月21日的列表:

dates = [date(year, month, 6) for month in range(1, 13)] +
    [date(year, month, 21) for month in range(1, 13)]

然后得到前一个工作日,即offset = -1。我用这个:

np.busday_offset(dates, -1, roll='forward', holidays=my_holidays)

我使用numpy.busday_offset而不是Pandas来做偏移的原因是它被矢量化并且运行得非常快,而Pandas busday偏移逻辑非常慢。如果日期的数量很少,那就不重要了。如果需要,您仍然可以使用Pandas生成假期列表。

请注意,roll='forward'是因为你想要的逻辑是,如果第6个是在周末或假日,你前滚到第7或第8,然后从那里你偏移-1个工作日来获得奖金。

相关问题