Просто для добавления бита, если информация, частичное индексирование строки выполняется по-другому с PeriodIndex
. Вы можете увидеть это наиболее непосредственно из:
period_ix.get_loc('2018')
#KeyError: Period('2018-01-01/2018-01-07', 'W-SUN')
Соответствующие строки расположены здесь в исходном коде, поэтому вы можете видеть, что строка '2018'
преобразуется в
pd.period('2018', freq=period_ix.freq)
#Period('2018-01-01/2018-01-07', 'W-SUN')
, которого нет в вашем PeriodIndex.
Вы можете получить такое же поведение частичной нарезки строк, используя PeriodIndex._get_string_slice
period_ix[period_ix._get_string_slice('2018')]
#PeriodIndex(['2018-06-25/2018-07-01', '2018-07-02/2018-07-08',
# '2018-07-09/2018-07-15', '2018-07-16/2018-07-22',
# '2018-07-23/2018-07-29', '2018-07-30/2018-08-05',
# '2018-08-06/2018-08-12', '2018-08-13/2018-08-19',
# ....
# '2018-12-24/2018-12-30', '2018-12-31/2019-01-06'],
# dtype='period[W-SUN]', freq='W-SUN')
Уже через год я согласен, что ваша версия int(year) in period_ix.year
подходит. Хотя, если вы хотите частичное с год и месяц, вам может понадобиться что-то вроде:
not period_ix[period_ix._get_string_slice('2018-08')].empty
True
или
def contains_partl(date, pidx):
sl = pidx._get_string_slice(date) #slice
return sl.start != sl.stop
contains_partl('2018', period_ix)
#True
contains_partl('2018-05', period_ix)
#False