2013-06-19 14 views
6

sto provando a creare un insieme di grafici a intervalli di giorno della settimana per un numero di ore (ad esempio osservazioni di temperatura di 5 minuti).Il modo migliore per generare grafici a scatole di giorno della settimana da un timeseries di Pandas

mio codice:

# ts is our timeseries 
ts = df.SomeColumn 

dow_map = {} 
days = ['MON','TUE','WED','THU','FRI','SAT','SUN'] 
dow_idx = ts.index.dayofweek 

i = 0 
for d in days: 
    dow_map[d] = ts[dow_idx == i] 
    i = i + 1 

df = pd.DataFrame(dow_map) 
df.boxplot() 

risultati in:

--------------------------------------------------------------------------- 
Exception         Traceback (most recent call last) 
<ipython-input-898-6070c45e4c4b> in <module>() 
    41  i = i + 1 
    42 
---> 43 df = pd.DataFrame(dow_map) 
    44 df.boxplot() 
... 
Exception: Reindexing only valid with uniquely valued Index objects 

ho trovato succcess creando DataFrames per ogni giorno della settimana e poi concat-zione loro in un dataframe finale, ma questo sembra inefficiente ...

+4

a parte, se si trova mai i + = 1 in python, probabilmente stai facendo male (in questo caso l'uso [ 'enumerate'] (http: // docs .python.org/2/library/functions.html # enumerate)) –

+0

Cosa ti aspetti che questo DataFrame assomigli? Sembra che sarebbe molto scarso ... –

risposta

9

primo Creare frame di dati e utilizzare il metodo giorni della settimana per ottenere i giorni della settimana:

import pandas as pd 
import numpy.random as random 
n=1000 
df = pd.DataFrame(random.randn(n), pd.date_range('2010-01-01', periods=n), columns=["data"]) 
df['Dates'] = df.index 
df['week_days'] =df.index.weekday 
df 

ora ruotare la tabella in modo che i giorni della settimana siano come colonne (potrebbe anche cambiare i giorni feriali in formati di stringa di giorni, ma lasciare quello per te.

x =df.pivot(index='Dates', columns='week_days', values='data') 
x.boxplot() 

enter image description here

+0

Ottima soluzione. Txs! –

1
import locale, calendar 
# for example pl_PL 
locale.setlocale(locale.LC_ALL, 'pl_PL.UTF-8') 
x = x.rename_axis(lambda x: calendar.day_abbr[x].capitalize())