2016-03-24 2 views
0
from dateutil.rrule import rrule, MONTHLY 

def fread_year_month(strt_dt, end_dt): 
     dates = [dt for dt in rrule(MONTHLY, dtstart=strt_dt, until=end_dt)] 
     return dates 

df = pd.DataFrame({ 
'value' : [4,2,5,6,7,8,6,5,4,1,2,4], 
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 12, 1)), 
'stock': ['amzn']*12 
},columns=[ 
'value', 'date', 'stock']) 

df2 = pd.DataFrame({ 
'value' : [1,1,1,1,1], 
'date': fread_year_month(dt.datetime(2015, 1, 1),dt.datetime(2015, 5, 1)), 
'stock': ['msft']*5 
},columns=[ 
'value', 'date', 'stock']) 

df = df.append(df2) 

df.set_index(['stock', 'date'], inplace=True) 

У меня есть вышеуказанная рамка данных панд. Как вы можете видеть, количество доступных данных для amzn не такое же, как msft. В этом примере даты являются последовательными, но это не обязательно (датами могут быть любые даты).pandas переиндексация с пропущенными датами

Если вселенная доступных дат является датой, для которой у меня есть данные для AMZN, то как я могу добавить эти точные даты для каждого другого запаса в моем кадре данных с помощью NaN или NA.

В примере дайте, я хочу вставить недостающие даты для msft в индекс и вставить NaN или NA для значения для этих индексов даты.

ответ

1

Если вы хотите работать с тикерами как колонны, может сделать unstack, как это:

In [71]: df.unstack(level=0) 
Out[71]: 
      value  
stock  amzn msft 
date     
2015-01-01 4.0 1.0 
2015-02-01 2.0 1.0 
2015-03-01 5.0 1.0 
2015-04-01 6.0 1.0 
2015-05-01 7.0 1.0 
2015-06-01 8.0 NaN 
2015-07-01 6.0 NaN 
2015-08-01 5.0 NaN 
2015-09-01 4.0 NaN 
2015-10-01 1.0 NaN 
2015-11-01 2.0 NaN 
2015-12-01 4.0 NaN 

переиндексации в ту же форму, from_product ниже создает новую MultiIndex со всеми комбинациями дат/тикеры.

In [75]: df.reindex(pd.MultiIndex.from_product(df.index.levels)) 
Out[75]: 
       value 
amzn 2015-01-01 4.0 
    2015-02-01 2.0 
    2015-03-01 5.0 
    2015-04-01 6.0 
    2015-05-01 7.0 
    2015-06-01 8.0 
    2015-07-01 6.0 
    2015-08-01 5.0 
    2015-09-01 4.0 
    2015-10-01 1.0 
    2015-11-01 2.0 
    2015-12-01 4.0 
msft 2015-01-01 1.0 
    2015-02-01 1.0 
    2015-03-01 1.0 
    2015-04-01 1.0 
    2015-05-01 1.0 
    2015-06-01 NaN 
    2015-07-01 NaN 
    2015-08-01 NaN 
    2015-09-01 NaN 
    2015-10-01 NaN 
    2015-11-01 NaN 
    2015-12-01 NaN 
1

Перед вашим слияния, вы можете сделать это (как панд 0.17):

>>> df2.set_index('date').reindex(df.date) 
      value stock 
date     
2015-01-01  1 msft 
2015-02-01  1 msft 
2015-03-01  1 msft 
2015-04-01  1 msft 
2015-05-01  1 msft 
2015-06-01 NaN NaN 
2015-07-01 NaN NaN 
2015-08-01 NaN NaN 
2015-09-01 NaN NaN 
2015-10-01 NaN NaN 
2015-11-01 NaN NaN 
2015-12-01 NaN NaN 
Смежные вопросы