2015-07-20 16 views
5

Bir kaç gün için, tatil yaptığım bir sonraki iş gününü hesaplamam gerekiyor.pandaların performansı özel iş günü ofseti

Şu anda, ben ipython not defterinden yapıştırdım aşağıdaki kodu gibi bir şey kullanıyorum: my bilgisayarda

import pandas as pd 
from pandas.tseries.holiday import USFederalHolidayCalendar 

cal = USFederalHolidayCalendar() 
bday_offset = lambda n: pd.datetools.offsets.CustomBusinessDay(n, calendar=cal) 

mydate = pd.to_datetime("12/24/2014") 
%timeit with_holiday = mydate + bday_offset(1) 
%timeit without_holiday = mydate + pd.datetools.offsets.BDay(1) 

, with_holiday çizgisi ~ 12 milisaniyede çalışır; ve non_holiday hattı ~ 15 mikrosaniyede çalışır.

bday_offset işlevini daha hızlı yapmanın herhangi bir yolu var mı?

cevap

5

Sanırım lambda üzerinden uyguladığınız yöntem yavaşlıyor. Birinci bölüm yavaş (documentaion düz az ya da çok alındığında) bu yöntemi

from pandas.tseries.offsets import CustomBusinessDay 
bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar()) 
mydate + bday_us 

Out[13]: Timestamp('2014-12-26 00:00:00') 

düşünün, ama yalnızca bir kez yapmanız gerekir. İkinci kısım ise çok hızlı.

%timeit bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar()) 
10 loops, best of 3: 66.5 ms per loop 

%timeit mydate + bday_us 
10000 loops, best of 3: 44 µs per loop 

burada, elma ile elma almak için benim makinede diğer zamanlamaları şunlardır:

%timeit with_holiday = mydate + bday_offset(1) 
10 loops, best of 3: 23.1 ms per loop 

%timeit without_holiday = mydate + pd.datetools.offsets.BDay(1) 
10000 loops, best of 3: 36.6 µs per loop 
+0

teşekkürler. Gün sayısını bir parametre olarak geçebileceğimi umuyordum, ama bir güne, zamanın% 90'ını telafi etmem gerekiyor, bu yüzden çözümünüz çok yardımcı olacak. – hahdawg

+1

@hahdawg Dokümanlara bakın, '2 * bday_us' yazabilirsiniz – JohnE