2012-05-12 14 views
16

pracowałem już od dłuższego czasu za pomocą Python i pandy do analizy zbioru danych godzinowych i znaleźć to bardzo miłe (pochodzących z Matlab.)pandy, python - jak wybrać konkretne razy timeseries

Teraz jestem trochę utknęły. Tworzę DataFrame tak:

SamplingRateMinutes=60 
index = DateRange(initialTime,finalTime, offset=datetools.Minute(SamplingRateMinutes)) 
ts=DataFrame(data, index=index) 

co chcę teraz zrobić, to wybrać dane dla wszystkich dni w godzinach od 10 do 13 i 20-23 do wykorzystywania danych do dalszych obliczeń. tej pory w plasterkach danych przy użyciu

selectedData=ts[begin:end] 

I jestem pewny, aby uzyskać jakąś brudną pętli, aby wybrać dane potrzebne. Ale musi istnieć bardziej elegancki sposób indeksowania exacly, czego chcę. Jestem pewien, że jest to wspólny problem i rozwiązanie w Pseudokod powinien wyglądać trochę tak:

myIndex=ts.index[10<=ts.index.hour<=13 or 20<=ts.index.hour<=23] 
selectedData=ts[myIndex] 

Aby wspomnieć Jestem inżynierem i nie programator :) ... jeszcze

Odpowiedz

7

Oto przykład, że robi co chcesz:

In [32]: from datetime import datetime as dt 

In [33]: dr = p.DateRange(dt(2009,1,1),dt(2010,12,31), offset=p.datetools.Hour()) 

In [34]: hr = dr.map(lambda x: x.hour) 

In [35]: dt = p.DataFrame(rand(len(dr),2), dr) 

In [36]: dt 

Out[36]: 
<class 'pandas.core.frame.DataFrame'> 
DateRange: 17497 entries, 2009-01-01 00:00:00 to 2010-12-31 00:00:00 
offset: <1 Hour> 
Data columns: 
0 17497 non-null values 
1 17497 non-null values 
dtypes: float64(2) 

In [37]: dt[(hr >= 10) & (hr <=16)] 

Out[37]: 
<class 'pandas.core.frame.DataFrame'> 
Index: 5103 entries, 2009-01-01 10:00:00 to 2010-12-30 16:00:00 
Data columns: 
0 5103 non-null values 
1 5103 non-null values 
dtypes: float64(2) 
+0

Działa! Wielkie dzięki! –

+2

Oto, jak to rozwiązanie zostanie zaimplementowane w składni na 0.10 i połączenie go z odpowiedzią Wesa poniżej: 'dr = pd.date_range (dt (2009,1,1), dt (2010, 12,31), freq = "H"); dt = pd.DataFrame (rand (len (dr), 2), dr); godzina = dt.index.hour; selektor = ((10 <= godzina) i (godzina <= 13)) | ((20 <= godzina) i (godzina <= 23)) dane = dt [selektor] ' –

24

W nadchodzących pand 0.8.0, będziesz w stanie napisać

hour = ts.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23)) 
data = ts[selector] 
6

Jak wygląda bałagan w moim komentarzu powyżej, postanowiłem dostarczyć kolejną odpowiedź, która jest zmiana składni dla pand 0.10.0 na odpowiedź Marca, w połączeniu z Wesa Podpowiedź:

import pandas as pd 
from datetime import datetime 

dr = pd.date_range(datetime(2009,1,1),datetime(2010,12,31),freq='H') 
dt = pd.DataFrame(rand(len(dr),2),dr) 
hour = dt.index.hour 
selector = ((10 <= hour) & (hour <= 13)) | ((20<=hour) & (hour<=23)) 
data = dt[selector] 
+0

występuje konflikt pakietu dt i zmiennej dt –

0

Pandy DataFrame ma wbudowany funkcja pandas.DataFrame.between_time

df = pd.DataFrame(np.random.randn(1000, 2), 
        index=pd.date_range(start='2017-01-01', freq='10min', periods=1000)) 

Tworzenie 2 ramek danych dla każdego okresu czasu:

df1 = df.between_time(start_time='10:00', end_time='13:00') 
df2 = df.between_time(start_time='20:00', end_time='23:00') 

ramka danych chcesz się połączyły i sortowane df1 i df2:

pd.concat([df1, df2], axis=0).sort_index() 
Powiązane problemy