2013-06-19 23 views
6

Próbuję utworzyć zestaw jednodniowych pól na czas dla serii czasu (na przykład 5-minutowych obserwacji temperaturowych).Najlepszy sposób na generowanie jednodniowych paczek z serialu czasowego Pandy

mój kod:

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

wyniki w:

--------------------------------------------------------------------------- 
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 

znalazłem succcess tworząc DataFrames za każdy dzień-of-tygodnia, a następnie concat-ing ich do ostatecznej DataFrame, ale wydaje się to nieefektywne ...

+4

bok, jeśli kiedykolwiek się znaleźć i + = 1 w Pythonie, jesteś prawdopodobnie robi to źle (w tym przypadku użyć [ 'enumerate'] (http: // docs .python.org/2/library/functions.html # enumerate)) –

+0

Czego oczekujesz od tego DataFrame? Wygląda na to, że byłoby to bardzo rzadkie ... –

Odpowiedz

9

1. Utwórz ramkę danych i użyj metody dni tygodnia, aby uzyskać dni tygodnia:

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 

teraz przestawiaj tę tabelę tak, aby dni_tygodniowe były jako kolumny (można również zmieniać dni tygodnia na formaty ciągów dni, ale zostawiając to za Ciebie.

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

enter image description here

+0

Świetne rozwiązanie. 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())