У меня есть фрейм данных pandas с DateTimeIndex на основе рабочего дня.Для каждого месяца, указанного в индексе, у меня также указывается один день «маркера».
Вот игрушечная версия этого фрейма данных:
# a dataframe with business dates as the index
df = pd.DataFrame(list(range(91)), pd.date_range('2015-04-01', '2015-6-30'), columns=['foo']).resample('B').last()
# each month has an single, arbitrary marker day specified
marker_dates = [df.index[12], df.index[33], df.index[57]]
Для каждого месяца в индексе мне нужно вычислить среднее значение столбца foo
в определенном срезе строк в этом месяце.
Существует два разных способа указания этих срезов:
1) с m-го по n-й день.
Примером может быть (2-4 рабочий день в этом месяце).Таким образом, апрель будет в среднем 1 (апрель 2), 4 (апрель 3) и 5 (апрель 6) = 3,33.Может быть 33 (4 мая), 34 (5 мая), 35 (6 мая) = 34. Я не считаю выходные / праздничные дни, которые не встречаются в индексе, днями.
2) m-й день до / после даты маркера до n-го дня до / после даты маркера.
Примером может быть «среднее значение среза за 1 день до маркера»дата до 1 дня после даты маркера в каждом месяце "Например.В апреле маркерная дата 17 апреля.Глядя на индекс, мы хотим получить среднее значение для apr16, apr17 и apr20.
Для примера 1 у меня было некрасивое решение: каждый месяц я бы вырезал строки этого месяца, а затем применил df_slice.iloc[m:n].mean()
Всякий раз, когда я начинаю делать итеративные вещи с пандами, я всегда подозреваю, что делаю это неправильно.Так что я думаю, что есть более чистый, питонический / векторизованный способ получения этого результата за все месяцы
Для примера 2 я не знаю хорошего способа сделать это усреднение среза на основе произвольных дат помного месяцев.