所以我可以通过蛮力做到这一点,但它非常缓慢,所以我确定我错过了一些东西。
假设我想创建一个(每天)固定长度的 DatetimeIndex,比如 15 天,但有一些注意事项:
- 如果 15 天指数在周末结束,那么它实际上在指数中的最后一个星期五结束,并且
- 如果 15 天期间包含审查日期,则审查日期不计入 15 天计数。审查日期可以远远超过 15 天。
为了详细说明第 2 点,假设我从 2018 年 1 月 1 日开始,但 2018 年 1 月 12 日到 2018 年 2 月 14 日被审查,所以我的 15 天期限可能是(蛮力方法):
possible = pd.date_range(start='2018-01-01', end='2018-12-31')
censored = pd.date_range(start='2018-01-12', end='2018-02-14')
bforce = pd.DatetimeIndex(set(possible)\
.difference(set(censored)))\
.sort_values()[:15]
idx = pd.DatetimeIndex([d for d in bforce if d.weekday() not in (5,6)])
这使:
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
'2018-01-05', '2018-01-08', '2018-01-09', '2018-01-10',
'2018-01-11', '2018-02-15', '2018-02-16'],
dtype='datetime64[ns]', freq=None)
哪个是对的。请注意,我忽略了最终索引中的所有周末,但没有将它们包括在审查日期值中,因为这会通过实际上不计算周末来将 15 天的时间段推长出去。该指数计算周末(但不使用它们),并且如果计算的值落在周末,则只需在周五之前结束。
以上显然是一团糟。我希望有一种更清洁的方法来做到这一点,特别是避免预先构建比我需要开始的更长的索引,以及多个中间列表结构?