2015-07-20 13 views
5

Per un sacco di date, ho bisogno di calcolare il giorno lavorativo successivo, dove conto per le vacanze.performance di giorno personalizzato giorno offset panda

Attualmente, sto usando qualcosa come il codice qui sotto, che ho incollato da IPython notebook:

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) 

Sul mio computer, la linea with_holiday viene eseguito in ~ 12 millisecondi; e la linea without_holiday viene eseguita in ~ 15 microsecondi.

Esiste un modo per rendere la funzione bday_offset più veloce?

risposta

5

Penso che il modo in cui lo state implementando tramite lambda stia rallentando. Considerate questo metodo (preso più o meno direttamente dal documentaion)

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

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

La prima parte è lento, ma avete solo bisogno di farlo una volta. La seconda parte è molto veloce però.

%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 

Per ottenere le mele alle mele, qui gli altri tempi sulla mia macchina:

%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

Grazie. Speravo di essere in grado di passare il numero di giorni come parametro, ma ho bisogno di un giorno di compensazione il 90% delle volte, quindi la tua soluzione ti aiuterà molto. – hahdawg

+1

@hahdawg Vedi i documenti, puoi scrivere '2 * bday_us' – JohnE