2016-08-12 5 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

이들에는 많은 벤치 마크 벤치 마크가 없습니다. 발행 (홍보가 더 좋다!); 이들은 모두 매우 쉽게 최적화 할 수 있습니다. – Jeff