timedelta方法的性能下降

问题描述:

为什么.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

.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操作中,我们看到它的时间花费在在一个缓慢的listcomp与GETATTR和Timedelta对象的构造(source):

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

对我来说这尖叫“看看,让我们得到它正确,当我们到达它时,我们将跨越优化桥梁。“

+0

这些没有许多perf基准 - 欢迎打开问题(公关更好!);这些都很容易优化 – Jeff