Ваша вторая попытка направлена в правильном направлении IIUC, вам просто нужно сделать повторную выборку, используя WeekOfMonth как правило, а не использовать его в качестве смещения:
dates_df.resample(WeekOfMonth(week=2, weekday=4)).asfreq().dropna()
Этот подход не сместит индекс, онследует просто возвращать данные за третью пятницу каждого месяца.
Работа с отсутствующей 3-ей пятницей:
С указанным выше кодом, если у вас пропущена третья пятница,весь месяц будет исключен.Но в зависимости от того, как вы хотите справиться с отсутствующими данными, вы можете bfill
, ffill
, pad
.. вы можете изменить вышеизложенное на следующее:
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).bfill().asfreq(freq='D').dropna()
Выше будет bfill
пропущенная 3-я пятница со следующим значением.
Обновление : позволяет работать с фиксированным набором данных вместо np.random
:
# create a smaller daterange
dates = pd.date_range("2018-05-01", "2018-08-31")
# create a data with only 1,2,3 values
data = [1,2,3] * int(len(dates)/3)
dates_df = pd.DataFrame(data=data, index=dates)
dates_df.head()
# Output:
2018-05-01 1
2018-05-02 2
2018-05-03 3
2018-05-04 1
2018-05-05 2
Теперь давайте проверим, как выглядят данные для 3-й пятницы каждого месяца, выбрав их вручную:
dates_df.loc[[
pd.Timestamp('2018-05-18'),
pd.Timestamp('2018-06-15'),
pd.Timestamp('2018-07-20'),
pd.Timestamp('2018-08-17')
]]
Output:
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 1
Если у вас нет пропущенных 3-х пятниц и запустите код, предоставленный ранее:
dates_df.resample(rule=WeekOfMonth(week=2,weekday=4)).asfreq().dropna()
Будет выдавать следующий вывод:
2018-05-18 3
2018-06-15 1
2018-07-20 3
2018-08-17 1
Как вы можете видеть, индекс здесь не был смещен и возвращал точные значения для 3-й пятницы каждого месяца.
Теперь предположим, что у вас пропущены 3-ий пятницы, в зависимости от того, как вы хотите это сделать (используйте предыдущее значение: ffill
или следующее значение bfill
):
- pad / ffill: распространить последнее действительное наблюдение вперед до следующего действительного
- backfill / bfill: использовать NEXT vaнаблюдение за крышкой, чтобы восполнить пробел'M' (конец месяца), а затем вы смещаете (смещаете вперед) индекс на 3-ю пятницу каждого месяца.
Как вы можете видеть до смещения, это выглядит так:
dates_df.resample(rule='M').asfreq().dropna()
# Output
2018-05-31 1
2018-06-30 1
2018-07-31 2
2018-08-31 3