web-dev-qa-db-ja.com

パンダ、python-時系列の特定の時間を選択する方法

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]

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

16
Dr. Dave

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

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)
7
Marc Shivers

今後のpandas 0.8.0では、次のように書くことができます

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

上記のコメントでは厄介に見えるので、別の回答を提供することにしました。これは、マークの回答のpandas 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]
6
K.-Michael Aye

Pandas 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()
2
mm441