2014-10-22 16 views
5

sto cercando di convertire un unstacked, indice datetime multi-indicizzato dati-telaio posteriore ad un singoli panda .Convert panda multi-indice per i panda timestamp

L'indice della mia originale dati-frame, vale a dire prima multi-indicizzazione e separazione, si presenta così:

In [1]: df1_season.index 
Out [1]: 

<class 'pandas.tseries.index.DatetimeIndex'> 
[2013-05-01 02:00:00, ..., 2014-07-31 23:00:00] 
Length: 1472, Freq: None, Timezone: None 

poi applico la multi-indicizzazione e separazione in modo da poter tracciare i dati annuali uno sopra l'altro in questo modo:

df_sort = df1_season.groupby(lambda x: (x.year, x.month, x.day, x.hour)).agg(lambda s: s[-1]) 
df_sort.index = pd.MultiIndex.from_tuples(df_sort.index, names=['Y','M','D','H']) 
unstacked = df_sort.unstack('Y') 

mio nuovo dati-struttura per i primi due giorni di maggio si presenta così:

In [2]: unstacked 
Out [2]: 

      temp  season   
Y  2013 2014 2013 2014 
M D H        
5 1 2 24.2 22.3 Summer Summer 
    8 24.1 22.3 Summer Summer 
    14 24.3 23.2 Summer Summer 
    20 24.6 23.2 Summer Summer 
    2 2 24.2 22.5 Summer Summer 
    8 24.8 22.2 Summer Summer 
    14 24.9 22.4 Summer Summer 
    20 24.9 22.8 Summer Summer 

736 rows × 4 columns 

L'indice per la nuova cornice datimostrato sopra appare come segue:

In [2]: unstacked.index.values[0:8] 
Out [2]: 

array([(5, 1, 2), (5, 1, 8), (5, 1, 14), (5, 1, 20), (5, 2, 2), (5, 2, 8), (5, 2, 14), 
     (5, 2, 20], dtype=object) 

che non produce una bella trama rispetto alle xticks (maggiori e minori). Se riesco a convertire questo multiindice in un singolo indice datetime pandas, usando solo i dati del mese, del giorno e dell'ora, allora i tick principali/secondari verranno tracciati automaticamente come vorrei (credo). Per esempio:

soluzione attuale:

xticks = (5, 1, 2), (5, 1, 8) … (5, 2, 20) 

soluzione richiesta:

xticks(major) = Day, Month (displayed as MAY 01, MAY 02 etc etc) 
xticks(minor) = Hour (displayed as 02h 08h … 20h) 
+0

Anche un piccolo suggerimento sarebbe molto apprezzato. – roi3i3ie

+0

Come faccio a rimbalzare per un po 'di supporto? Ci sono alcune domande qui oltre un anno senza alcuna risposta. – roi3i3ie

+0

Un altro mese? Qualunque cosa ti aiuterà ... – roi3i3ie

risposta

0
import pandas as pd 
import matplotlib.pyplot as plt 
from numpy.random import randn 

ts = pd.Series(randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 
ts = ts.cumsum() 

plt.figure() 
for year in set(ts.index.year): 
    tmp = ts[str(year)].values 
    plt.plot(tmp, label = year) 
plt.legend() 
plt.show() 

Credo che questo sia un modo migliore per raggiungere il tuo obiettivo di re-indicizzazione. Cosa ne pensi?

+0

Hey !, grazie molte per la risposta. Ok, ho appena provato. Sì, questo sembra essere un modo molto più semplice di impilare/ordinare i dati annuali uno sopra l'altro in una trama, quindi grazie per quello. Tuttavia, non è una soluzione alla domanda. Invece dei miei xticks, minori/maggiori, codificati annualmente (ad es. Ora del mese del giorno), sono ora suddivisi in blocchi arbitrari di punti dati singoli, scalati da 0 a n-1, dove n è il numero datapoint nella mia misurazione set di campioni. – roi3i3ie

+0

Giusto, immagino che a quel punto sia una manipolazione di tick x_axis ... ma non sono in grado di capire come farlo esattamente. Potresti caricare i dati su un CSV da qualche parte in modo da poter giocare con esso e magari creare un altro post su questo? Sarebbe il termine migliore per questo essere un 'Seasonality Plot'- prendere informazioni da più anni e tracciarli su un asse Jan-Dec? Non riesco a trovare alcuna documentazione su come fare questo che mi sorprende. – EngineeredE

+0

Hey! Sono stato via, mi dispiace per il ritardo. Lascia che ti risponda su questo. Ti darò anche un csv. Sì alla tua domanda anche. Questo è esattamente ciò che riguarda la trama. – roi3i3ie

1

La conversione dei dati avanti e indietro in panda diventa molto veloce, come sembra che tu abbia provato. La mia raccomandazione in generale su panda e indicizzazione, non è mai solo quella di impostare l'indice, ma di copiarlo prima. Assicurati di avere una colonna che contiene l'indice, poiché i panda non consentono tutte le operazioni sull'indice, e l'impostazione intensa e il reset dell'indice possono far scomparire le colonne.

TLDR; Non convertire l'indice indietro. Mantieni una copia.

+0

Questo vale anche per il principio aperto/chiuso: http://en.wikipedia.org/wiki/Open/closed_principle – firelynx

Problemi correlati