Как сделать так, чтобы панды знали о праздничных датах?

#python #pandas

#python #панды

Вопрос:

Я просматривал документацию здесь

У меня есть фрейм данных, который содержит ежедневный временной ряд (обратите внимание, что 2013-03-29 является праздником и mydf содержит 2013-03-28).

 import pandas as pd

business_month_end_dates = pd.date_range('2010-01-31', '2014-04-30', freq='BM')

business_month_end_dates

DatetimeIndex(['2010-02-26', '2010-03-31', '2010-04-30', '2010-05-31',
           '2010-06-30', '2010-07-30', '2010-08-31', '2010-09-30',
           '2010-10-29', '2010-11-30', '2010-12-31', '2011-01-31',
           '2011-02-28', '2011-03-31', '2011-04-29', '2011-05-31',
           '2011-06-30', '2011-07-29', '2011-08-31', '2011-09-30',
           '2011-10-31', '2011-11-30', '2011-12-30', '2012-01-31',
           '2012-02-29', '2012-03-30', '2012-04-30', '2012-05-31',
           '2012-06-29', '2012-07-31', '2012-08-31', '2012-09-28',
           '2012-10-31', '2012-11-30', '2012-12-31', '2013-01-31',
           '2013-02-28', '2013-03-29', '2013-04-30', '2013-05-31',
           '2013-06-28', '2013-07-31', '2013-08-30', '2013-09-30',
           '2013-10-31', '2013-11-29', '2013-12-31', '2014-01-31',
           '2014-02-28', '2014-03-31', '2014-04-30'],
          dtype='datetime64[ns]', freq='BM')
 

Затем я создаю даты окончания рабочего года:

 business_year_end_dates =  pd.date_range(business_month_end_dates[0],
                                 business_month_end_dates[len(business_month_end_dates)-1],
                                 freq=BYearEnd(month=3))

business_year_end_dates

DatetimeIndex(['2010-03-31', '2011-03-31', '2012-03-30', '2013-03-29',
           '2014-03-31'],
          dtype='datetime64[ns]', freq='BA-MAR')
 

Мой ожидаемый результат :

 DatetimeIndex(['2010-03-31', '2011-03-31', '2012-03-30', '2013-03-28',
       '2014-03-31'],
      dtype='datetime64[ns]', freq='BA-MAR')
 

Должны ли панды понимать, BM business month end frequency что 2013-03-29 — это праздник?

Если нет, то как мне сделать Pandas осведомленным, чтобы при использовании BM он использовал предыдущий рабочий день в данном случае 2013-03-28?

Комментарии:

1. Праздники сильно зависят от страны, поэтому разумно, что по умолчанию pandas ничего не включает. На той самой странице документации, которую вы цитируете, есть несколько примеров использования пользовательских рабочих дней (для включения желаемых праздников).

2. Это «экспериментально», и, возможно, еще не наступил конец рабочего года, но на это стоит обратить внимание.

Ответ №1:

Попробуйте что-то вроде этого:

 import numpy as np
import pandas as pd
from pandas.tseries.offsets import CustomBusinessMonthEnd

index = pd.date_range('2010-01-31', '2014-04-30', freq='BM')
df = pd.DataFrame(data=np.random.rand(len(index), 2), columns=['a', 'b'], index=index)

holidays = ['2013-03-29']

df = df.resample(rule=CustomBusinessMonthEnd(holidays=holidays)).last()

df = df.loc[df.index.month==3]
 

Вывод:

 >>>df.index
>>>DatetimeIndex(['2010-03-31', '2011-03-31', '2012-03-30', '2013-03-28', '2014-03-31'], dtype='datetime64[ns]', freq='12CBM')