2012-06-08 47 views
12

E 'possibile reindicizzare un panda DataFrame utilizzando una colonna composta da oggetti datetime?pandas reindex DataFrame con oggetti datetime

Ho un dataframe df con le seguenti colonne:

Int64Index: 19610 entries, 0 to 19609 
Data columns: 
cntr     19610 non-null values #int 
datflt    19610 non-null values #float 
dtstamp    19610 non-null values #datetime object 
DOYtimestamp   19610 non-null values #float 
dtypes: int64(1), float64(2), object(1) 

posso reindicizzare il df facilmente lungo DOYtimestamp con: df.reindex(index=df.dtstamp) e DOYtimestamp ha i seguenti valori:

>>> df['DOYtimestamp'].values 
    array([ 153.76252315, 153.76253472, 153.7625463 , ..., 153.98945602, 
    153.98946759, 153.98947917]) 

ma' mi piacerebbe reindicizzare il DataFrame lungo dtstamp che è costituito da oggetti datetime in modo da generare timestam differenti ps direttamente dall'indice. La colonna dtstamp ha valori che sembrano:

>>> df['dtstamp'].values 
    array([2012-06-02 18:18:02, 2012-06-02 18:18:03, 2012-06-02 18:18:04, ..., 
    2012-06-02 23:44:49, 2012-06-02 23:44:50, 2012-06-02 23:44:51], 
    dtype=object) 

Quando provo e reindicizzare df lungo dtstamp ottengo il seguente:

>>> df.reindex(index=df.dtstamp) 
    TypeError: can't compare datetime.datetime to long 

Sono solo, non sicuro di quello che ho bisogno di fare ottenere l'indice essere di un tipo datetime. qualche idea?

risposta

23

Sembra che tu non voglia reindex. Un po 'di confusione reindex non è per la definizione di un nuovo indice, esattamente; piuttosto, cerca le righe che hanno gli indici specificati. Quindi, se hai un DataFrame con indice [0, 1, 2], allora un reindex([2, 1, 0]) restituirà le righe in ordine inverso. Fare qualcosa come reindex([8, 9, 10]) non crea un nuovo indice per le righe; piuttosto, restituirà un DataFrame con valori NaN, poiché non ci sono righe con indici 8, 9 o 10.

Sembra che quello che vuoi sia mantenere solo le stesse righe, ma creare un indice totalmente nuovo per loro. Per questo puoi semplicemente assegnare direttamente all'indice. Quindi prova a fare df.index = df['dtstamp'].

+0

Grazie, fa esattamente quello di cui ho bisogno. In qualche modo non mi era chiaro che potessi assegnare una delle colonne all'indice. – BFTM

+8

Puoi anche usare il metodo 'set_index' –