Pandas DataFrame
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3425100 entries, 2011-12-01 00:00:00 to 2011-12-31 23:59:59
Data columns:
sig_qual 3425100 non-null values
heave 3425100 non-null values
north 3425099 non-null values
west 3425097 non-null values
dtypes: float64(4)
.ix[start_datetime:end_datetime]
を使用してそのDataFrame
のサブセットを選択し、これを peakdetect function に渡します。これは、2つの個別のリストでローカルの最大値と最小値のインデックスと値を返します。最大値のインデックス位置を抽出し、DataFrame.index
を使用してpandas TimeStampsのリストを取得します。
次に、TimeStampのリストを.ix[]
に渡して、大規模なDataFrameの関連するサブセットを抽出しようとしますが、常に空のDataFrame
を返すようです。 TimeStampsのリストをループして、DataFrame
から関連する行を取得できますが、これは長いプロセスであり、ix[]
は the docs ?に従って値のリストを受け入れる必要があると思いました(Pandas 0.7の例ではnumpy.ndarray
のnumpy.datetime64
を使用していることがわかります)
更新:DataFrameの小さな8秒のサブセットが以下で選択されています。#行はいくつかの値を示しています。
y = raw_disp['heave'].ix[datetime(2011,12,30,0,0,0):datetime(2011,12,30,0,0,8)]
#csv representation of y time-series
2011-12-30 00:00:00,-310.0
2011-12-30 00:00:01,-238.0
2011-12-30 00:00:01.500000,-114.0
2011-12-30 00:00:02.500000,60.0
2011-12-30 00:00:03,185.0
2011-12-30 00:00:04,259.0
2011-12-30 00:00:04.500000,231.0
2011-12-30 00:00:05.500000,139.0
2011-12-30 00:00:06.500000,55.0
2011-12-30 00:00:07,-49.0
2011-12-30 00:00:08,-144.0
index = y.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-12-30 00:00:00, ..., 2011-12-30 00:00:08]
Length: 11, Freq: None, Timezone: None
#_max returned from the peakdetect function, one local maxima for this 8 seconds period
_max = [[5, 259.0]]
indexes = [x[0] for x in _max]
#[5]
timestamps = [index[z] for z in indexes]
#[<Timestamp: 2011-12-30 00:00:04>]
print raw_disp.ix[timestamps]
#Empty DataFrame
#Columns: array([sig_qual, heave, north, west, extrema], dtype=object)
#Index: <class 'pandas.tseries.index.DatetimeIndex'>
#Length: 0, Freq: None, Timezone: None
for timestamp in timestamps:
print raw_disp.ix[timestamp]
#sig_qual 0
#heave 259
#north 27
#west 132
#extrema 0
#Name: 2011-12-30 00:00:04
Update 2:I created a Gist 、データがcsvから読み込まれたときにタイムスタンプのインデックス列が読み込まれるため、実際に機能します文字列のように見えるオブジェクトのnumpy配列として格納されます。インデックスがタイプ<class 'pandas.tseries.index.DatetimeIndex'>
であり、各要素がタイプ<class 'pandas.lib.Timestamp'>
である私の独自のコードとは異なり、pandas.lib.Timestamp
のリストを渡すと、個々のタイムスタンプを渡すのと同じように機能すると思いました。バグと見なされますか?
文字列のリストとしてインデックスを使用して元のDataFrame
を作成すると、文字列のリストを使用したクエリは正常に機能します。ただし、DataFrameのバイトサイズは大幅に増加します。
Update 3:エラーは非常に大きなDataFrameでのみ発生するようです。DataFrameのさまざまなサイズでコードを再実行しました(以下のコメントに詳細が記載されています)。 270万レコードを超えるDataFrameで発生するようです。 TimeStampsではなく文字列を使用すると問題が解決しますが、メモリ使用量が増加します。
修正済み最新のgithubマスター(2012年9月18日)では、ページ下部のWesからのコメントを参照してください。
df.ix [my_list_of_dates]は問題なく動作するはずです。
In [193]: df
Out[193]:
A B C D
2012-08-16 2 1 1 7
2012-08-17 6 4 8 6
2012-08-18 8 3 1 1
2012-08-19 7 2 8 9
2012-08-20 6 7 5 8
2012-08-21 1 3 3 3
2012-08-22 8 2 3 8
2012-08-23 7 1 7 4
2012-08-24 2 6 0 6
2012-08-25 4 6 8 1
In [194]: row_pos = [2, 6, 9]
In [195]: df.ix[row_pos]
Out[195]:
A B C D
2012-08-18 8 3 1 1
2012-08-22 8 2 3 8
2012-08-25 4 6 8 1
In [196]: dates = [df.index[i] for i in row_pos]
In [197]: df.ix[dates]
Out[197]:
A B C D
2012-08-18 8 3 1 1
2012-08-22 8 2 3 8
2012-08-25 4 6 8 1