2012-05-12 14 views
16

私は時間ごとのデータのセットを分析するためのpythonとパンダを使用してかなりの時間が今働いて、それはかなり良い見つける(。MATLABから来る)パンダ、のpython - 時系列で特定の時間を選択する方法

今、私は詰まった私はそのような私のDataFrameを作成しました:

更なる計算のためのデータを使用する時間13から10と20から23ですべての日のためのデータを選択することで私が今やりたい
SamplingRateMinutes=60 
index = DateRange(initialTime,finalTime, offset=datetools.Minute(SamplingRateMinutes)) 
ts=DataFrame(data, index=index) 

。 は、これまでのところ私は

selectedData=ts[begin:end] 

を使用してデータをスライスし、私は必要なデータを選択するために、汚れたループのいくつかの種類を取得することを確認しています。しかし、私が望むようにexaclyインデックスを付ける、よりエレガントな方法が必要です。私は、これは共通の問題であると確信していると擬似コード内の溶液は、多少そのようになります。

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

に言及し、私はエンジニアやプログラマーなし:) ...まだ

答えて

7

はここでない例ですしていますあなたが欲しいもの:今後のパンダ0.8.0では

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

Works!どうもありがとう! –

+2

このソリューションが0.10の構文でどのように実装され、以下のWesの答えと組み合わされるのですか? 'dr = pd.date_range(dt(2009,1,1)、dt(2010,12,31)、freq = 'H'); dt = pd.DataFrame(rand(len(dr)、2)、dr); 時間= dt.index.hour; セレクタ=((10 <=時)&(時<= 13))| データ= dt [セレクタ] ' –

24

を、次のように書くことができるでしょう

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

は、それが上記の私のコメントに乱雑に見えるように、私はウェスヒントと組み合わせるマルクの答えにパンダ0.10.0の構文のアップデート、ある別の答えを提供することを決定した:

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

dtパッケージとdt変数の競合があります(20 <=時)&(時<= 23) –

0

パンダDATAFRAMEは内蔵しています機能 pandas.DataFrame.between_time

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

時間の各期間の2つのデータフレームを作成します。

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

したいデータフレームをマージしてソートされていますdf1およびdf2:

pd.concat([df1, df2], axis=0).sort_index() 
関連する問題