我认为尝试并行处理可能会使事情过于复杂化。我还没有在大样本上尝试过这种方法,所以你的结果可能会有所不同,但它应该能给你一个想法…
让我们先从一些日期开始…
import pandas as pd
dates = pd.to_datetime(['2016-01-03', '2016-09-09', '2016-12-12', '2016-03-03'])
我们将使用来自
pandas.tseries.holiday
的一些假日数据 - 请注意,实际上我们需要一个
DatetimeIndex
...
from pandas.tseries.holiday import USFederalHolidayCalendar
holiday_calendar = USFederalHolidayCalendar()
holidays = holiday_calendar.holidays('2016-01-01')
这给我们带来了:
DatetimeIndex(['2016-01-01', '2016-01-18', '2016-02-15', '2016-05-30',
'2016-07-04', '2016-09-05', '2016-10-10', '2016-11-11',
'2016-11-24', '2016-12-26',
...
'2030-01-01', '2030-01-21', '2030-02-18', '2030-05-27',
'2030-07-04', '2030-09-02', '2030-10-14', '2030-11-11',
'2030-11-28', '2030-12-25'],
dtype='datetime64[ns]', length=150, freq=None)
现在,我们使用 searchsorted
寻找原始日期最近假期的索引:
indices = holidays.searchsorted(dates)
next_nearest = holidays[indices]
然后取两者之间的差值:
next_nearest_diff = pd.to_timedelta(next_nearest.values - dates.values).days
您需要小心索引,以免出现错误,并且对于前一个日期,请使用indices-1
进行计算,但它应该作为(我希望)相对较好的基础。