2013-03-21 2 views
2

У меня есть следующие питона панда таймсериякак изменить порядок передискретизации в питоне таймсериях

index = pandas.date_range('4/1/2012','9/30/2012', freq='M') 
df = pandas.DataFrame(numpy.random.randn(len(index),1), index=index) 
df = 
2012-04-30 1.06 
2012-05-31 0.82 
2012-06-30 0.65 
2012-07-31 1.12 
2012-08-31 1.09 
2012-09-30 0.65 

Тогда я изменить частоту от одного месяца до двух месяцев

df_new = df.resample('2M') 

Функции Resample старт от самой ранней даты до последней даты. Выход, который я получаю, выглядит следующим образом:

df_new = 
2012-04-30 ... 
2012-06-30 ... 
2012-08-31 ... 
2012-10-30 ... 

, в то время как я хочу, чтобы алгоритм передискретировал в обратном порядке. Я хочу, чтобы на выходе что-то вроде этого:

df_new = 
2012-05-31 ... 
2012-07-31 ... 
2012-09-30 ... 

Может кто-нибудь пожалуйста, помогите с этим .. спасибо заранее

ответ

1

Используйте loffset параметр:

In [8]: df 
Out[8]: 
        0 
2012-04-30 0.667305 
2012-05-31 -1.353332 
2012-06-30 0.132986 
2012-07-31 -0.697344 
2012-08-31 -1.043487 
2012-09-30 -0.050352 

In [9]: df.resample('2M', loffset='M') 
Out[9]: 
        0 
2012-05-31 0.667305 
2012-07-31 -0.610173 
2012-09-30 -0.870416 
2012-11-30 -0.050352 
+0

см. User1827356 ответ ниже, вам действительно нужны как loffset, так и как = 'last' здесь –

3

ОК, это гораздо сложнее, чем это должно быть - но здесь идет

In [282]: df 
Out[282]: 
        0 
2012-04-30 0.583255 
2012-05-31 -0.247403 
2012-06-30 0.816290 
2012-07-31 -1.989587 
2012-08-31 0.740463 
2012-09-30 0.971749 


In [279]: df.resample('2M', how='last', closed='left', loffset='-1M') 
Out[279]: 
        0 
2012-05-31 -0.247403 
2012-07-31 -1.989587 
2012-09-30 0.971749 


how='last' gets last value in group 
closed='left' forces first date[2012-04-30] to be the start of the group (maybe side effect) 
loffset='-1M' adjust label appropriately 
+0

oh hmm ... на самом деле перечитывая вопрос, я думаю, что вы правы, что 'loffset' недостаточно, вам нужны оба как = 'last' и loffset. Я хочу, чтобы в этом вопросе содержалось требуемое выравнивание данных, чтобы оно было понятнее. –

+0

how = 'last' помогает, но не решает проблему полностью. Это связано с тем, что повторная выборка считается первой датой [2012-04-30] - это конец периода времени [6M]. Если это можно было бы контролировать с помощью параметра, это решило бы вопрос – user1827356

0

Эти вещи, как правило, много сложнее, чем вы ожидаете. Я согласен с Чангом в том, что это поможет получить очень четкий пример того, как должно быть точное выравнивание. Обратите внимание, что также важно, чтобы входные данные в примере также имели месячную частоту. Окончательное выравнивание от указанных выше раствора изменяется, например, если входная частота дней, см:

import pandas as pd 

index = pd.date_range('4/1/2012','9/30/2012', freq='D') 
df = pd.DataFrame({'Date': index, 'Doy': index.dayofyear}, index=index) 

df.resample('2M', how='last', closed='left', loffset='-1M') 

          Date Doy 
2012-04-30 2012-05-30 00:00:00 151 
2012-06-30 2012-07-30 00:00:00 212 
2012-08-31 2012-09-29 00:00:00 273 
2012-10-31 2012-09-30 00:00:00 274 

В качестве альтернативы может быть использована частота в «MS», создавая еще один подход:

df.resample('2MS', how='last', loffset='2M') 

          Date Doy 
2012-05-31 2012-05-31 00:00:00 152 
2012-07-31 2012-07-31 00:00:00 213 
2012-09-30 2012-09-30 00:00:00 274 

It все сводится к тому, как вы определяете начало и конец бункера.

Смежные вопросы