Сортировка и вывод по условию в датасете pandas

Имеется следующий датасет (строк много):

date user event_type parameter
0 2020-04-01_00:01:08 770906 770906 3 unknown
1 2020-04-01_00:00:30 527877 527877 1 text
2 2020-04-01_00:01:12 539948 539948 3 picture
3 2020-04-01_00:01:20 107541 107541 3 picture
4 2020-04-01_00:01:38 374954 374954 4 text

Пробовал вот так:

df.date = df.date.str.replace(r'\s.*','', regex=True)
df.date = pd.to_datetime(df.date, format='%Y-%m-%d_%H:%M:%S')
df[df['date']=='2020-04-18' + pd.Timedelta(30, "m")]

Но выдает ошибку:

TypeError: can only concatenate str (not "Timedelta") to str

Подскажите, как решить?


Ответы (1 шт):

Автор решения: DiMithras

С подсветкой синтаксиса, конечно, понятнее что у Вас происходит.
Фильтровать datetime по строчной переменной нельзя

Можно так:

df[df['date'].dt.date==pd.to_datetime('2020-04-18')]

.dt.date обрезает datetime с временем до даты и сравнивает с датой pd.to_datetime('2020-04-18')
Таким образом получаем все записи на данную дату игнорируя время.

Альтернативно можно обращаться к году, месяцу и дню непосредственно:

df[(df['date'].dt.year == 2020) & (df['date'].dt.month == 4) & (df['date'].dt.day == 18)]

Если в dataset только один день, то можно сократить до:

df[df['date'].dt.day == 18]

Что касается timedelta, её добавлять можно исключительно к колонке:

df[df['date'].dt.day == 18]['date'] + pd.Timedelta(30, "m")

Кстати, обращаться к колонке можно через .:

df[df.date.dt.day == 18].date + pd.Timedelta(30, "m")

В качестве прямо совсем альтернативы, можно не приводить колонку date к datetime и фильтровать по строковой переменной:

d̶f̶.̶d̶a̶t̶e̶ ̶=̶ ̶d̶f̶.̶d̶a̶t̶e̶.̶s̶t̶r̶.̶r̶e̶p̶l̶a̶c̶e̶(̶r̶'̶\̶s̶.̶*̶'̶,̶'̶'̶,̶ ̶r̶e̶g̶e̶x̶=̶T̶r̶u̶e̶)̶
̶d̶f̶.̶d̶a̶t̶e̶ ̶=̶ ̶p̶d̶.̶t̶o̶_̶d̶a̶t̶e̶t̶i̶m̶e̶(̶d̶f̶.̶d̶a̶t̶e̶,̶ ̶f̶o̶r̶m̶a̶t̶=̶'̶%̶Y̶-̶%̶m̶-̶%̶d̶_̶%̶H̶:̶%̶M̶:̶%̶S̶'̶)̶
df[df.date.str.contains('2020-04-18')]

Но timedelta с этим делом работать не будет.

→ Ссылка