2015-05-21 4 views
0

Я искал в Интернете, но ничего не нашел по проблеме, с которой я столкнулся.Производительность управляемых часами Pandas DateTimeIndex

Кажется, что операции pandas.DataFrame по индексу с датами, ориентированными на часовой пояс, на порядок медленнее, чем в обычные даты.

Здесь приведены тайминги ipython.

первый со стандартным DateTimes:

import pandas as pd 
import numpy as np 

dates=pd.date_range('2010/01/01 00:00:00', '2010/12/31 00:00:00', freq='1T') 
DF=pd.DataFrame(data=np.random.rand(len(dates)), index=dates, columns=["value"]) 

# compute timedeltas between dates 
%timeit DF["temp"] = DF.index 
%timeit DF["deltas"] = (DF["temp"] - DF["temp"].shift()) 

результатов:

1000 loops, best of 3: 1.13 ms per loop 
100 loops, best of 3: 17.1 ms per loop 

до сих пор, так хорошо.

теперь просто добавив часовой пояс информацию:

import pandas as pd 
import numpy as np 

dates=pd.date_range('2010/01/01 00:00:00', '2010/12/31 00:00:00', freq='1T') 
# NEW: filter dates to avoid DST problems 
dates=dates[dates.hour>2] # to avoid AmbiguousInferError or NonExistentDateError 

DF=pd.DataFrame(data=np.random.rand(len(dates)), index=dates, columns=["value"]) 

# NEW: add timezone info 
DF.index = DF.index.tz_localize(tz="America/New_York", ambiguous="infer") 

# compute timedeltas between dates 
%timeit DF["temp"] = DF.index 
%timeit DF["deltas"] = (DF["temp"] - DF["temp"].shift()) 

и теперь результаты:

1 loops, best of 3: 5.43 s per loop 
1 loops, best of 3: 16 s per loop 

почему это ??
я действительно не понимаю, где узкое место здесь ...

для получения информации (от conda list):

anaconda     2.2.0    np19py34_0 
conda      3.12.0     py34_0 

numpy      1.9.2     py34_0 
pandas     0.16.1    np19py34_0 
pytz      2015.4     py34_0 
scipy      0.15.1    np19py34_0 
+0

, если я просто установить часовой пояс по Гринвичу с tz_localize (TZ = pytz.utc), тайминги: 11,4 сек, в то время как даты не изменилась на всех от стандартных DateTimes. –

ответ

2

Это известная проблема, см here. Datetimes с наивным tz (например, часовой пояс NO) Series эффективно представлены с типом datetime64[ns]. Расчеты с использованием int64 и т. Д. Довольно быстрые. tz-aware Series представлены с использованием object dtype. Эти вычисления довольно немного медленнее.

Это можно исправить (см. Упомянутую проблему), чтобы иметь равномерный tz-aware Series. Приглашения по запросу приветствуются!

In [9]: df = DataFrame({'datetime' : pd.date_range('20130101',periods=5), 'datetime_with_tz' : pd.date_range('20130101',periods=5,tz='US/Eastern')}) 

In [10]: df 
Out[10]: 
    datetime   datetime_with_tz 
0 2013-01-01 2013-01-01 00:00:00-05:00 
1 2013-01-02 2013-01-02 00:00:00-05:00 
2 2013-01-03 2013-01-03 00:00:00-05:00 
3 2013-01-04 2013-01-04 00:00:00-05:00 
4 2013-01-05 2013-01-05 00:00:00-05:00 

In [11]: df.dtypes 
Out[11]: 
datetime   datetime64[ns] 
datetime_with_tz   object 
dtype: object 
Смежные вопросы