2017-09-19 1 views
0

私は以下のようなインデックスとしてfloat値とtimestampの1つの列を持つデータフレームを持っています。索引内のすべてのタイムスタンプは昇順にソートされます。私は直線的に補間するにはどうすればよいパンダのデータフレームの2つの近傍(上および下または左および右)に基づくNaNの線形補間

timestamp   value 
2014-01-08 08:00:42 1 
2014-01-08 08:01:00 NaN 
2014-01-08 08:01:12 3 
2014-01-08 08:01:52 7 
2014-01-08 08:02:02 9 

は/ 1と3の値(すなわち上方および下方値)に「のみ」に基づくNaN値を転嫁します。データフレームは膨大で、最大2 GBまで実行できます。あなたはデータフレームの値にそれらの比率を適用し、インデックス内のタイムスタンプの差に基づいて補間するあなたの質問を更新:だから速度は、この操作のために

おかげ

+1

https://stackoverflow.com/questions/25234782/replace-nan-or-missing-values-with-rolling-mean-or-other-interpolation? – Zero

+0

私はパンダdfのローリング機能について知らない。だから私はこのオプションで検索することができませんでした。このリンクをご指摘いただきありがとうございます。私の質問には非常に関連しています。ありがとう – RTM

+0

私はタイムスタンプが等間隔でないことを質問に追加したいだけです。彼らは大きく異なっています。したがって、補間は、タイムスタンプとそれらがどれくらい離れているかにも基づいています。 – RTM

答えて

2

編集が重要です。

ここで、実際にきちんと迅速でなければならないことについて行くの粗方法だ:

ts = pd.to_datetime(['2014-01-08 08:00:42', 
        '2014-01-08 08:01:00', 
        '2014-01-08 08:01:12', 
        '2014-01-08 08:01:52', 
        '2014-01-08 08:02:02']) 

df = pd.DataFrame([1, np.nan, 3, 7, 9], index=ts, columns=['value']) 
td = df.index.to_series().diff().dt.total_seconds() 
interp = df.value.shift(1) + (df.value.shift(-1) - df.value.shift(1)) \ 
     * td/(td.shift(-1) + td) 

df['value'] = df['value'].fillna(interp) 
print(df) 
        value 
2014-01-08 08:00:42 1.0 
2014-01-08 08:01:00 2.2 
2014-01-08 08:01:12 3.0 
2014-01-08 08:01:52 7.0 
2014-01-08 08:02:02 9.0 

この例では、第2の位置にNaNは、それぞれ、以下の18単位以上12個の単位ではtimedelta差異を有します。したがって、1 +(3 - 1)*(18 /(18 + 12))の値で埋める必要があります。

数学を単純化することもできます。

もう1つのこと:この回答に取り組んでいるうちに、私はタイムディスタを計算することについて私自身の質問をしました。 @piRSquaredは、スピードがあなたにとってそれほど重要であれば、より速い解決策hereを持っています。

+0

ありがとうございます。私は前に指定した代入関数に、時間を表すインデックスを参照し、時間の間隔に基づいて補間することを要求することによって、いくつかの変更を行いました。それは本当にうまくいって、コードはきれいに見えます:) – RTM

関連する問題