2013-06-19 6 views
6

Ich versuche, eine Reihe von Wochentags-Boxplots für eine Zeitreihe zu erstellen (z. B. 5-Minuten-Temperaturbeobachtungen).Die beste Methode zum Generieren von Wochentags-Boxplots aus einer Pandas-Zeitreihe

Mein Code:

# 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() 

Ergebnisse 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 

I Succcess fand von Datenrahmen für jedes Tag-of-Woche und dann concat-ing sie in einen endgültigen Datenrahmen zu schaffen, aber dies scheint ineffizient ...

+4

beiseite, wenn Sie jemals selbst finden i + = 1 in Python, sind Sie wahrscheinlich etwas falsch gemacht (in diesem Fall benutzen [ 'enumerate'] (http: // docs .python.org/2/library/functions.html # enumerate)) –

+0

Wie soll dieser DataFrame aussehen? Es scheint, als wäre es sehr spärlich ... –

Antwort

9

erste Datenrahmen erstellen und Wochentag Methode verwenden, um Tage der Woche zu erhalten:

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 

Jetzt schwenken Sie diese Tabelle, so dass die week_days als Spalten sind (könnte auch die Bedürfnisse in String-Formate von Tagen ändern, aber das für Sie verlassen.

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

enter image description here

+0

Große Lösung. 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())