【问题标题】:DateOffset in Pandas with a Holiday Calendar带有假日日历的 Pandas 中的 DateOffset
【发布时间】:2012-11-07 21:44:58
【问题描述】:

Pandas 目前允许您将工作日添加到给定日期datetime.today() + 3*BDay()。我想扩展工作日的概念,以排除给定的假期和周末的 DateIndex。是否可以将 DateIndex 合并到偏移量中?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    CustomBusinessDay 类现已合并到即将发布的 Pandas 0.12 版本中,您可以在其中执行以下操作:

    >>> from pandas.tseries.offsets import CustomBusinessDay
    >>> 
    >>> # As an interesting example, let's look at Egypt where
    >>> # a Friday-Saturday weekend is observed.
    >>> weekmask_egypt = 'Sun Mon Tue Wed Thu'
    >>> 
    >>> # They also observe International Workers' Day so let's
    >>> # add that as a holiday for a couple of years
    >>> holidays = ['2012-05-01', datetime(2013, 5, 1), np.datetime64('2014-05-01')]
    >>> 
    >>> bday_egypt = CustomBusinessDay(holidays=holidays, weekmask=weekmask_egypt)
    >>> dt = datetime(2013, 4, 30)
    >>> print dt + 2 * bday_egypt
    2013-05-05 00:00:00
    >>> 
    >>> dts = date_range(dt, periods=5, freq=bday_egypt).to_series()
    >>> print dts
    2013-04-30   2013-04-30 00:00:00
    2013-05-02   2013-05-02 00:00:00
    2013-05-05   2013-05-05 00:00:00
    2013-05-06   2013-05-06 00:00:00
    2013-05-07   2013-05-07 00:00:00
    Freq: C, dtype: datetime64[ns]
    >>> 
    >>> print Series(dts.weekday, dts).map(Series('Mon Tue Wed Thu Fri Sat Sun'.split()))
    2013-04-30    Tue
    2013-05-02    Thu
    2013-05-05    Sun
    2013-05-06    Mon
    2013-05-07    Tue
    dtype: object
    

    HTH

    【讨论】:

    • 太棒了。我也每天都在使用它,除了绘制以下解决方法通常可以解决问题之外没有任何问题:custom_series.asfreq('B', method='pad').plot()
    【解决方案2】:

    目前我认为您需要创建一个自定义子类。您需要覆盖 applyonOffset 方法以考虑您的假期日历。

    我们最终应该在业务 X 频率中添加一个可选的假日日历参数。我做了一个 github issue 来跟踪它:https://github.com/pydata/pandas/issues/2301

    【讨论】:

    • 我可以看到,如果它针对所有偏移量而不是仅针对工作日完成,该功能会更有用。剩下的不多,但仍有一些地方认为星期六是工作日。因此,在这种情况下,需要排除周日和特定假期。
    • @rhaskett 我在 Github 上为这个问题贡献了一些代码。看看它是否满足您的需求。
    • 巧妙使用numpy。当它投入生产时,我会试一试。谢谢
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多