Панды: выберите последние четыре даты с уровня отсечения - PullRequest
1 голос
/ 06 апреля 2019

Привет, у меня есть список дат, и я хочу посмотреть на даты, и если дата между 1 января и 31 марта, то выберите эту дату в качестве даты окончания для этого конкретного года и возьмите предыдущие 4 датыкак часть этого года.(Для каждого года есть только 4 даты, поэтому между указанным диапазоном никогда не будет 2 дат).

Мои данные выглядят так:

         date
0        1995-03-15
1        1995-07-06
2        1995-09-13
3        1995-12-12
4        1996-03-14
5        1996-07-01
6        1996-09-17
7        1996-12-12
8        1997-03-13
9        1997-06-25
10       1997-09-10
11       1997-12-12

И я бы хотелесть что-то вроде этого (в отдельном столбце)

          year
0         1994
1         1995
2         1995
3         1995
4         1995
5         1996
6         1996
7         1996
8         1996
9         1997
10        1997
11        1997

Среди прочего я пробовал следующее:

df['year'] = df.date.dt.to_period('A-MAR')

Однако я не смог пройти диапазон между январем иМарт ... Я также подумал, что, возможно, я мог бы выбрать только месяц из столбца даты с помощью: df['month'] = df['date'].dt.month, а затем сделать функцию, которая выбирает последние строки для даты между [1 и 3] (включая)и помещает год в другой столбец ??

Кто-нибудь есть какие-либо идеи по поводу этой проблемы?Спасибо!

1 Ответ

2 голосов
/ 06 апреля 2019

Использование:

y = df.date.dt.year
mask = df.date.dt.month.between(1, 3)
df['year'] = y.where(mask).bfill().fillna(y.max() + 1).sub(1).astype(int)
print (df)
         date  year
0  1995-03-15  1994
1  1995-07-06  1995
2  1995-09-13  1995
3  1995-12-12  1995
4  1996-03-14  1995
5  1996-07-01  1996
6  1996-09-17  1996
7  1996-12-12  1996
8  1997-03-13  1996
9  1997-06-25  1997
10 1997-09-10  1997
11 1997-12-12  1997

Объяснение

Используйте Series.between по месяцам с Series.where для замены NaN s на несоответствующие значения:

print (y.where(df.date.dt.month.between(1, 3)))
0     1995.0
1        NaN
2        NaN
3        NaN
4     1996.0
5        NaN
6        NaN
7        NaN
8     1997.0
9        NaN
10       NaN
11       NaN
Name: date, dtype: float64

Затем воспользуйтесь обратным заполнением пропущенных значений:

print (y.where(df.date.dt.month.between(1, 3)).bfill())
0     1995.0
1     1996.0
2     1996.0
3     1996.0
4     1996.0
5     1997.0
6     1997.0
7     1997.0
8     1997.0
9        NaN
10       NaN
11       NaN
Name: date, dtype: float64

Пропущенные значения (последние строки) заменяются на год максимума с добавлением 1:

print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1))
0     1995.0
1     1996.0
2     1996.0
3     1996.0
4     1996.0
5     1997.0
6     1997.0
7     1997.0
8     1997.0
9     1998.0
10    1998.0
11    1998.0
Name: date, dtype: float64

Последнее вычитание одного года:

print (y.where(df.date.dt.month.between(1, 3)).bfill().fillna(y.max() + 1).sub(1))
0     1994.0
1     1995.0
2     1995.0
3     1995.0
4     1995.0
5     1996.0
6     1996.0
7     1996.0
8     1996.0
9     1997.0
10    1997.0
11    1997.0
Name: date, dtype: float6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...