#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')