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]
言うまでもなく、私はエンジニアであり、プログラマーではありません:)...まだ
これがあなたが望むことをする例です:
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)
今後のpandas 0.8.0では、次のように書くことができます
hour = ts.index.hour
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23))
data = ts[selector]
上記のコメントでは厄介に見えるので、別の回答を提供することにしました。これは、マークの回答の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]
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()