Сортировка и вывод по условию в датасете 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 шт):
С подсветкой синтаксиса, конечно, понятнее что у Вас происходит.
Фильтровать 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 с этим делом работать не будет.