16

私は今、一連の時間別データを分析するために python と pandas を使用してかなり長い間作業しており、非常に優れていることがわかりました (Matlab から来ています)。

今、私はちょっと立ち往生しています。私はDataFrameそのように作成しました:

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

ここでやりたいことは、すべての日の 10 時から 13 時と 20 時から 23 時までのデータを選択して、そのデータをさらに計算に使用することです。これまでのところ、次を使用してデータをスライスしました

 selectedData=ts[begin:end]

そして、必要なデータを選択するために、ある種のダーティループが発生することは間違いありません。しかし、私が望むものを正確にインデックス化するためのよりエレガントな方法が必要です。これは一般的な問題であり、疑似コードでの解決策は次のようになるはずです。

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

私はエンジニアであり、プログラマーではありません:) ...まだ

4

4 に答える 4

26

次の pandas 0.8.0 では、次のように記述できるようになります。

hour = ts.index.hour
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23))
data = ts[selector]
于 2012-05-12T20:46:40.990 に答える
7

これはあなたが望むことをする例です:

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)
于 2012-05-12T17:03:18.753 に答える
6

上記の私のコメントが乱雑に見えるので、別の回答を提供することにしました。これは、Marc の回答に対する pandas 0.10.0 の構文更新と、Wes のヒントを組み合わせたものです。

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]
于 2012-12-28T00:16:44.100 に答える