2016-05-19 6 views
0

をスライス:パイソン/パンダ - 私は次の通りであるIがパンダとのPythonに読んだデータフレームを持っている時間に行番号を変換して

>>> df id temp 0 1 272.53702 1 2 272.41101 2 3 272.18503 3 4 271.79102 4 5 271.33701 5 6 270.86200 6 7 270.41501 7 8 269.97501 8 9 269.56201 9 10 269.18802 ...

idフィールドからすべての時間を表します私の目標は、2001年5月1日から2006年11月20日までの気温を表すtempの列からリストを抽出し、次にリストに合うようにすることです(1989年1月1日深夜1時)。 Scipyのスプライン補間を使用します。私の質問 - idをdatetimeに変換する最も効率的な方法は何ですか?次に、適切な日付範囲を取得するためにスライスしますか?

ありがとうございました。

+0

を? – EdChum

答えて

1

あなたが探している開始日と終了日に対応するid値を決定するために日付計算を使用して、関連する]を選択しlocを使用することができます温度。これは、idのすべての値を日付に変換してからスライスするよりも高速になる可能性があります。

start = 24*(pd.to_datetime('2002-05-01') - pd.to_datetime('1989-01-01')).days 
end = 24*(pd.to_datetime('2006-11-20') - pd.to_datetime('1989-01-01')).days - 1 
temp_values = df.loc[df['id'].between(start, end), 'temp'].values 

「11月20日、2006年に」、私はあなたがデータて20日にしたい場合は、だけではなく、20日の21日を使用しますが、までを意味と仮定したが、11月20日、2006年を含めていないよことにより、 endの計算で。私はendから1つを減算して、計算に使用された日付を含まないように、計算の日付より前の1時間前の最後の時間を取得します。

+0

こんにちは、ご協力いただきありがとうございます。私は、 'temp_values'の長さが' df [start:end] 'でスライスした後の行の数よりも1長くなっていることに気付きました。何故ですか? – potpie

+0

'df [start:end]'は、 'end'を含まないPythonのスライス表記を使用します。 'temp_values'では、' end'を含むpandasの '.between'を使用しています。私が 'end'をどう計算したかに基づいて、あなたはそれを含めたいと思います。 – root

+0

実際、 'start'は含まれていませんでした。 '終了'条件はスライスされた 'df'と' temp_values'の両方にありました。 'df [start-1:end]'を 'temp_values'とマッチさせました。 – potpie

0

は、ここであなたが使用するために必要なものは基本的です:

>>> from datetime import datetime, timedelta 
>>> print datetime(1989, 1, 1) 
1989-01-01 00:00:00 
>>> print datetime(1989, 1, 1) + timedelta(hours=5) 
1989-01-01 05:00:00 
0

私はちょうどあなたが選択のためのdatetimeオブジェクトを渡すことができるようになりますdatetime列の追加を提案:なぜあなただ​​けid` `から` datetime`列を作成していない

In [162]: 
df['date'] = dt.datetime(1989,1,1) + pd.TimedeltaIndex(df['id'], 'h') 
df 

Out[162]: 
    id  temp    date 
0 1 272.53702 1989-01-01 01:00:00 
1 2 272.41101 1989-01-01 02:00:00 
2 3 272.18503 1989-01-01 03:00:00 
3 4 271.79102 1989-01-01 04:00:00 
4 5 271.33701 1989-01-01 05:00:00 
5 6 270.86200 1989-01-01 06:00:00 
6 7 270.41501 1989-01-01 07:00:00 
7 8 269.97501 1989-01-01 08:00:00 
8 9 269.56201 1989-01-01 09:00:00 
9 10 269.18802 1989-01-01 10:00:00 

In [163]: 
df.loc[df['date'] > '1989-01-01 06:00'] 

Out[163]: 
    id  temp    date 
6 7 270.41501 1989-01-01 07:00:00 
7 8 269.97501 1989-01-01 08:00:00 
8 9 269.56201 1989-01-01 09:00:00 
9 10 269.18802 1989-01-01 10:00:00