2012-12-18 17 views
5

非常に便利なパンダを使用してデータを時系列で扱うと、DateTimeを持つデータに直接(スプラインなどで)補間できるライブラリが存在しないように見えますx軸?私はいつも最初に何か浮動小数点数に変換するように強制されているようです、1980年以降の秒のようなものか、そういうものです。x軸上で時間とともに動作するPythonスプラインまたは他の補間?

私はこれまでのところ、奇妙なフォーマットのため申し訳ありませんが、私はipythonのノートにこのようなものを持っている、と私はそこからセルをコピーすることはできません、次のことをしようとしていた。

from scipy.interpolate import InterpolatedUnivariateSpline as IUS 
type(bb2temp): pandas.core.series.TimeSeries 
s = IUS(bb2temp.index.to_pydatetime(), bb2temp, k=1) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-67-19c6b8883073> in <module>() 
----> 1 s = IUS(bb2temp.index.to_pydatetime(), bb2temp, k=1) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/scipy/interpolate/fitpack2.py in __init__(self, x, y, w, bbox, k) 
    335   #_data == x,y,w,xb,xe,k,s,n,t,c,fp,fpint,nrdata,ier 
    336   self._data = dfitpack.fpcurf0(x,y,k,w=w, 
--> 337          xb=bbox[0],xe=bbox[1],s=0) 
    338   self._reset_class() 
    339 

TypeError: float() argument must be a string or a number 

bb2temp.index.valuesを使用することにより(それは、これらのようになります。

array([1970-01-15 184:00:35.884999, 1970-01-15 184:00:58.668999, 
     1970-01-15 184:01:22.989999, 1970-01-15 184:01:45.774000, 
     1970-01-15 184:02:10.095000, 1970-01-15 184:02:32.878999, 
     1970-01-15 184:02:57.200000, 1970-01-15 184:03:19.984000, 

)のx引数として、興味深いことに、スプラインクラスは、インターポレータを作成していますが、補間しようとしたとき、それはまだ壊れ/ここに私の最終的な目標である大きなDateTimeIndex()に外挿し。ここではそれがどのように見えるかです:

all_times = divcal.timed.index.levels[2] # part of a MultiIndex 

all_times 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2009-07-20 00:00:00.045000, ..., 2009-07-20 00:30:00.018000] 
Length: 14063, Freq: None, Timezone: None 

s(all_times.values) # applying the above generated interpolator 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-74-ff11f6d6d7da> in <module>() 
----> 1 s(tall.values) 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/scipy/interpolate/fitpack2.py in __call__(self, x, nu) 
    219 #   return dfitpack.splev(*(self._eval_args+(x,))) 
    220 #  return dfitpack.splder(nu=nu,*(self._eval_args+(x,))) 
--> 221   return fitpack.splev(x, self._eval_args, der=nu) 
    222 
    223  def get_knots(self): 

/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/scipy/interpolate/fitpack.py in splev(x, tck, der, ext) 
    546 
    547   x = myasarray(x) 
--> 548   y, ier =_fitpack._spl_(x, der, t, c, k, ext) 
    549   if ier == 10: 
    550    raise ValueError("Invalid input data") 

TypeError: array cannot be safely cast to required type 

私は同じTypeError: array cannot be safely cast to required typeで、同様s(all_times)s(all_times.to_pydatetime())を使用しようとしました。

私は、幸いにも、正しいですか?誰もが時間を浮動小数点に変換するのに慣れていたのですが、これらの補間は自動的に機能するはずです。 (私は最終的に貢献するために非常に有用なプロジェクトを発見したでしょう)またはあなたは私が間違っていることを証明し、いくつかのSOポイントを獲得したいですか? ;)

編集:警告:補間ルーチンに渡す前に、pandasデータでNaNを確認してください。彼らは何にも不平を言うことはありませんが、ただ静かに失敗します。

答えて

5

下に使用されているこれらのfitpackルーチンは浮動小数点数を必要とするという問題があります。したがって、ある時点では、datetimeからfloatへの変換が必要です。この変換は簡単です。 bb2temp.index.valuesがあなたのdatetime型の配列である場合は、単に実行します。

In [1]: bb2temp.index.values.astype('d') 
Out[1]: 
array([ 1.22403588e+12, 1.22405867e+12, 1.22408299e+12, 
     1.22410577e+12, 1.22413010e+12, 1.22415288e+12, 
     1.22417720e+12, 1.22419998e+12]) 

あなたは自分のスプラインにそれを渡す必要があります。結果をdatetimeオブジェクトに変換するには、results.astype('datetime64')を実行します。

+0

私はそれが簡単でなければならないと思っていた、ありがとう!しかし、私は、高レベルのscipy補間ルーチンへのパッチが私のためにそれを行うことができると正しく仮定していますか? –

+0

もちろん、パッチがそれをするでしょう。しかし、まだ私には残酷なようです。 'array.dtype == 'datetime64'のような単純なものかもしれません:array = array.astype( 'd')'、そしてその逆の出力です。 – tiago

+0

私は彼らがとにかくそれをしないと困惑している理由です;)あなたが仕事をしていない場合、なぜ高級クラスをフィッティングパックの上に導入するのですか? splrepとInterpolatedUnivariateSplineの間のステップの多くは、単純な1つまたは2つのライナーでした。合計で、彼らは数えます。 –

関連する問題