pandas 自定义工作日抵消的表现
performance of pandas custom business day offset
对于大量日期,我需要计算下一个工作日,其中我考虑了假期。
目前,我正在使用类似下面的代码,我从 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)
在我的电脑上,with_holiday 行运行大约需要 12 毫秒; without_holiday 行在 ~15 微秒内运行。
有什么方法可以使 bday_offset 函数更快?
我认为您通过 lambda 实现它的方式正在减慢它的速度。考虑这种方法(或多或少直接取自 documentaion )
from pandas.tseries.offsets import CustomBusinessDay
bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())
mydate + bday_us
Out[13]: Timestamp('2014-12-26 00:00:00')
第一部分比较慢,但你只需要做一次。虽然第二部分非常快。
%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
为了取得圆满成功,以下是我机器上的其他计时:
%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
对于大量日期,我需要计算下一个工作日,其中我考虑了假期。
目前,我正在使用类似下面的代码,我从 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)
在我的电脑上,with_holiday 行运行大约需要 12 毫秒; without_holiday 行在 ~15 微秒内运行。
有什么方法可以使 bday_offset 函数更快?
我认为您通过 lambda 实现它的方式正在减慢它的速度。考虑这种方法(或多或少直接取自 documentaion )
from pandas.tseries.offsets import CustomBusinessDay
bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())
mydate + bday_us
Out[13]: Timestamp('2014-12-26 00:00:00')
第一部分比较慢,但你只需要做一次。虽然第二部分非常快。
%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
为了取得圆满成功,以下是我机器上的其他计时:
%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