2016-08-12 7 views
3

.dt.days.dt.total_seconds()より100倍長くなるのはなぜですか?timedeltaメソッドのパフォーマンスが遅い

df = pd.DataFrame({'a': pd.date_range('2011-01-01 00:00:00', periods=1000000, freq='1H')}) 
df.a = df.a - pd.to_datetime('2011-01-01 00:00:00') 
df.a.dt.days # 12 sec 
df.a.dt.total_seconds() # 0.14 sec 
+2

より速い選択肢は 'days = pd.Series(df ['a'] .dt.values.astype( 'timedelta64 [D]'))' – unutbu

答えて

3

.dt.total_seconds基本的には乗算である、とnumpythonic高速に行うことができます。

def total_seconds(self): 
    """ 
    Total duration of each element expressed in seconds. 

    .. versionadded:: 0.17.0 
    """ 
    return self._maybe_mask_results(1e-9 * self.asi8) 

我々はdays操作を中止した場合、我々はそれがGETATTRと遅いlistcompにその時間を費やしています見るのに対しそして、はtimedeltaオブジェクト(source)の構築:

360   else: 
    361    result = np.array([getattr(Timedelta(val), m) 
--> 362        for val in values], dtype='int64') 
    363   return result 
    364 

私にはこれは、「のはそれが正しい取得してみましょう、見て悲鳴最適化ブリッジを通過します」と述べています。

+0

です。これらのベンチマークは多くありません。発行(PRはさらに良い!);これらはすべて非常に簡単に最適化できます – Jeff

関連する問題