Я думаю, что здесь лучше 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