2012-11-13 26 views
15

Ho un nome di dizionario date_dict composto da date datetime con valori corrispondenti ai conteggi interi delle osservazioni. Lo converto in una serie sparsa/dataframe con osservazioni censurate che vorrei unire o convertire in una serie/dataframe con date continue. La spiacevole comprensione delle liste è il mio trucco per aggirare il fatto che i panda apparentemente non copieranno automaticamente gli oggetti datetime con un indice DateTime appropriato.Riempimento del frameframe panda continuo dal dataframe sparse

df1 = pd.DataFrame(data=date_dict.values(), 
        index=[datetime.datetime.combine(i, datetime.time()) 
          for i in date_dict.keys()], 
        columns=['Name']) 
df1 = df1.sort(axis=0) 

Questo esempio ha 1258 osservazioni e l'indice DateTime viene eseguito dal 2003-06-24 al 2012-11-07.

df1.head() 
      Name 
Date 
2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

posso creare un dataframe vuoto con un indice DateTime continua, ma questo introduce una colonna non necessari e sembra goffa. Mi sento come se mi mancasse una soluzione più elegante che coinvolge un join.

df2 = pd.DataFrame(data=None,columns=['Empty'], 
        index=pd.DateRange(min(date_dict.keys()), 
             max(date_dict.keys()))) 
df3 = df1.join(df2,how='right') 
df3.head() 
      Name Empty 
2003-06-24 2 NaN 
2003-06-25 NaN NaN 
2003-06-26 NaN NaN 
2003-06-27 NaN NaN 
2003-06-30 NaN NaN 

C'è un modo più semplice o più elegante per riempire una dataframe continuo da una dataframe sparsa in modo che ci sia (1) un indice continuo, (2) la NaNs sono 0s, e (3) non c'è colonna vuota rimasta nel dataframe?

  Name 
2003-06-24 2 
2003-06-25 0 
2003-06-26 0 
2003-06-27 0 
2003-06-30 0 

risposta

20

È possibile utilizzare la reindicizzazione solo su una serie storica utilizzando l'intervallo di date. Inoltre sembra che tu stia meglio usando TimeSeries invece di DataFrame (vedi documentation), sebbene la reindicizzazione sia anche il metodo corretto per aggiungere anche valori di indice mancanti a DataFrames.

Per esempio, a partire da:

date_index = pd.DatetimeIndex([pd.datetime(2003,6,24), pd.datetime(2003,8,13), 
     pd.datetime(2003,8,19), pd.datetime(2003,8,22), pd.datetime(2003,8,24)]) 

ts = pd.Series([2,1,2,1,5], index=date_index) 

ti dà una serie storica come la testa il tuo esempio di dataframe:

2003-06-24 2 
2003-08-13 1 
2003-08-19 2 
2003-08-22 1 
2003-08-24 5 

Semplicemente facendo

ts.reindex(pd.date_range(min(date_index), max(date_index))) 

poi ti dà un indice completo , con NaNs per i valori mancanti (puoi usare fillna se vuoi riempire il mi ssing valori con altri valori - vedi here):

2003-06-24  2 
2003-06-25 NaN 
2003-06-26 NaN 
2003-06-27 NaN 
2003-06-28 NaN 
2003-06-29 NaN 
2003-06-30 NaN 
2003-07-01 NaN 
2003-07-02 NaN 
2003-07-03 NaN 
2003-07-04 NaN 
2003-07-05 NaN 
2003-07-06 NaN 
2003-07-07 NaN 
2003-07-08 NaN 
2003-07-09 NaN 
2003-07-10 NaN 
2003-07-11 NaN 
2003-07-12 NaN 
2003-07-13 NaN 
2003-07-14 NaN 
2003-07-15 NaN 
2003-07-16 NaN 
2003-07-17 NaN 
2003-07-18 NaN 
2003-07-19 NaN 
2003-07-20 NaN 
2003-07-21 NaN 
2003-07-22 NaN 
2003-07-23 NaN 
2003-07-24 NaN 
2003-07-25 NaN 
2003-07-26 NaN 
2003-07-27 NaN 
2003-07-28 NaN 
2003-07-29 NaN 
2003-07-30 NaN 
2003-07-31 NaN 
2003-08-01 NaN 
2003-08-02 NaN 
2003-08-03 NaN 
2003-08-04 NaN 
2003-08-05 NaN 
2003-08-06 NaN 
2003-08-07 NaN 
2003-08-08 NaN 
2003-08-09 NaN 
2003-08-10 NaN 
2003-08-11 NaN 
2003-08-12 NaN 
2003-08-13  1 
2003-08-14 NaN 
2003-08-15 NaN 
2003-08-16 NaN 
2003-08-17 NaN 
2003-08-18 NaN 
2003-08-19  2 
2003-08-20 NaN 
2003-08-21 NaN 
2003-08-22  1 
2003-08-23 NaN 
2003-08-24  5 
Freq: D, Length: 62 
+2

Grazie! Ho usato ts.reindex (pd.date_range (min (date_index), max (date_index)), fill_value = 0) –