Проверьте, указан ли год в PeriodIndex - PullRequest
1 голос
/ 26 апреля 2019

У меня есть DataFrame, который индексируется PeriodIndex, и мне нужно проверить, содержит ли индекс год.

Вот фрагмент того, что я пробовал до сих пор:

In [1]: import pandas as pd

In [2]: period_ix = pd.period_range(start='2018-07-01', end='2019-04-30', freq='W')

In [3]: '2018' in period_ix
Out[3]: False

In [4]: '2018' in period_ix.year
Out[4]: False

In [5]: 2018 in period_ix.year
Out[5]: True

In [6]: 2018 in period_ix
Out[6]: False

In [7]: '2019' in period_ix
Out[7]: True

In [8]: '2019' in period_ix.year
Out[8]: False

In [9]: 2019 in period_ix.year
Out[9]: True

In [10]: 2019 in period_ix
Out[10]: False

Я прибегнул к использованию int(year) in period_ix.year, так как он давал ожидаемый результат для каждого года (будь то строка или int).

Тем не менее, я заинтересован в использовании '2018' in period_ix, поскольку он кажется более новым и последовательным, чем то, что я делаю. Я полагаю, что если кто-то вставит '2018', это будет интерпретировано как '2018-01-01', отсюда и Ложь.

1 Ответ

1 голос
/ 26 апреля 2019

Просто для добавления бита, если информация, частичное индексирование строки выполняется по-другому с 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
...