Я изо всех сил пытаюсь найти правильный способ решить проблему с передискретизацией с помощью панд, вместо использования уродливых хаков, которые могут быть подвержены ошибкам.
Предположим, у меня есть серия, подобная этой:
dates = pd.date_range('2018-01-03', '2018-09-13')
s = pd.Series(range(len(dates)), index=dates)
Теперь я хочу пересчитать серию в месяцы, но начиная с первой даты из индекса, а не с первого дня месяца.Например, если я просто перевыпишу код «MS», первая дата, которую я получу, будет 2018-01-01, а не 2018-01-03;Конечно, это «начало месяца», так что это то, чего я должен ожидать, но как я могу сделать повторную выборку ежемесячно, не выбирая выборки с начала месяца, а скорее с того же месяца, чтобы результирующий индекс былкак ["2018-01-03", "2018-02-03" и т. д.]?
Другими словами, как я могу выполнить повторную выборку с чем-то вроде "месяц, начинающийся с первой даты-времени в индексе"?
Единственный способ, который я до сих пор нашел, - это создать несколько ведущих дат в серии, затем сделать отрицательное смещение, а затем использовать параметр loffset (потому что ни shift, ни loffset не учитывают выравнивание данныхк индексу), но это очень уродливый хак, которого я хотел бы избежать.
Спасибо!
[РЕШЕНИЕ]
IРешил это с помощью простых шагов, адаптировав несколько попыток решить эту проблему (включая первый ответ ниже, но также другие сайты и вопросы от SO):
dates = pd.date_range('2018-01-03', '2018-09-13')
s = pd.Series(range(len(dates)), index=dates)
delta = dates.min() - (dates.min() - offsets.MonthBegin(1))
new_dates = dates - delta
s2 = s.copy()
s2.index = new_dates
resampled = s2.resample('MS', loffset=delta)
r_max = resampled.max()
r_min = resampled.min()
r_mean = resampled.mean()
r_sum = resampled.sum()
print('s\n', s)
print('r_max\n', r_max)
print('r_min\n', r_min)
print('r_mean\n', r_mean)
print('r_sum\n', r_sum)
Спасибо за помощь!