Фильтрация строк из нескольких столбцов даты на основе указанных c год и месяц в Pandas - PullRequest
1 голос
/ 11 марта 2020

Для данного кадра данных следующим образом:

   id  start_date    end_date
0   1   2014/5/26   2014/5/27
1   2   2014/6/27   2014/6/28
2   3   2014/7/20   2014/7/21
3   4   2014/9/12   2014/9/13
4   5  2014/10/10  2014/10/11
5   6   2020/3/20   2020/4/21
6   7   2020/4/10   2020/4/11
7   8   2020/4/15   2020/4/16
8   9   2020/3/23   2020/3/24
9  10    2020/4/6    2020/4/7

Я хочу отфильтровать строки, которые либо start_date, либо end_date находятся в диапазоне 2020-02, 2020-03, 2020-04, спасибо, что поделились другими дополнительными решениями, кроме моего .

Результат будет выглядеть так:

   id start_date   end_date
5   6 2020-03-20 2020-04-21
6   7 2020-04-10 2020-04-11
7   8 2020-04-15 2020-04-16
9  10 2020-04-06 2020-04-07

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Я думаю, что здесь лучше DataFrame.apply для обработки по столбцам, DataFrame.applymap для обработки поэлементно:

df[['start_date', 'end_date']] = (df[['start_date', 'end_date']]
                                   .apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d')))

Тогда для фильтрации используется месячные периоды на Series.dt.to_period:

df = (df[(df['start_date'].dt.to_period('m')== '2020-04') | 
         (df['end_date'].dt.to_period('m')== '2020-04')])
print (df)
   id start_date   end_date
5   6 2020-03-20 2020-04-21
6   7 2020-04-10 2020-04-11
7   8 2020-04-15 2020-04-16
9  10 2020-04-06 2020-04-07

Решение с l oop по столбцам возможно на np.logical_or.reduce, решение лучше, если больше столбцов:

c = ['start_date', 'end_date']
df[c] = df[c].apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))

df = df[np.logical_or.reduce([df[x].dt.to_period('m')== '2020-04' for x in c])]
print (df)
   id start_date   end_date
5   6 2020-03-20 2020-04-21
6   7 2020-04-10 2020-04-11
7   8 2020-04-15 2020-04-16
9  10 2020-04-06 2020-04-07
0 голосов
/ 11 марта 2020

Работает следующее решение:

df[['start_date', 'end_date']] = df[['start_date', 'end_date']].applymap(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
df.loc[((df['start_date'].dt.year == 2020) & (df['start_date'].dt.month==4)) | ((df['end_date'].dt.year == 2020) & (df['end_date'].dt.month==4))]

Out:

   id start_date   end_date
5   6 2020-03-20 2020-04-21
6   7 2020-04-10 2020-04-11
7   8 2020-04-15 2020-04-16
9  10 2020-04-06 2020-04-07
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...