2015-07-20 15 views
5

Đối với một tấn ngày, tôi cần phải tính toán ngày làm việc tiếp theo, nơi tôi tài khoản cho ngày lễ.hiệu suất của gấu trúc tùy chỉnh ngày làm việc bù đắp

Hiện nay, tôi đang sử dụng một cái gì đó giống như mã dưới đây, mà tôi đã dán từ máy tính xách tay IPython:

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) 

Trên máy tính của tôi, dòng with_holiday chạy trong ~ 12 mili giây; và dòng without_holiday chạy trong ~ 15 micro giây.

Có cách nào để làm cho hàm bday_offset hoạt động nhanh hơn không?

Trả lời

5

Tôi nghĩ cách bạn đang triển khai nó qua lambda đang làm chậm nó xuống. Xem xét phương pháp này (lấy nhiều hơn hoặc ít hơn ngay từ documentaion)

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

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

Phần đầu tiên là chậm, nhưng bạn chỉ cần thực hiện một lần. Phần thứ hai là rất nhanh mặc dù.

%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 

Để có được táo để táo, đây là những timings khác trên máy tính của tôi:

%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

Cảm ơn. Tôi đã hy vọng để có thể vượt qua số ngày như một tham số, nhưng tôi cần một ngày bù đắp 90% thời gian, vì vậy giải pháp của bạn sẽ giúp đỡ rất nhiều. – hahdawg

+1

@hahdawg Xem tài liệu, bạn có thể viết '2 * bday_us' – JohnE

Các vấn đề liên quan