0

所以我可以通过蛮力做到这一点,但它非常缓慢,所以我确定我错过了一些东西。

假设我想创建一个(每天)固定长度的 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 天的时间段推长出去。该指数计算周末(但不使用它们),并且如果计算的值落在周末,则只需在周五之前结束。

以上显然是一团糟。我希望有一种更清洁的方法来做到这一点,特别是避免预先构建比我需要开始的更长的索引,以及多个中间列表结构?

4

0 回答 0