Удаление столбцов с определенными условиями

#python #pandas

Вопрос:

У меня есть вывод фрейма данных из скрипта python, который выдает следующий вывод

Дата и время Высокий Низкий Время
546 2021-06-15 14:30:00 15891.049805 15868.049805 14:30:00
547 2021-06-15 14:45:00 15883.000000 15869.900391 14:45:00
548 2021-06-15 15:00:00 15881.500000 15866.500000 15:00:00
549 2021-06-15 15:15:00 15877.750000 15854.549805 15:15:00
550 2021-06-15 15:30:00 15869.250000 15869.250000 15:30:00

я хочу удалить все строки, в которых время равно 15:30:00. пробовал разные вещи, но не смог этого сделать. Помогите, пожалуйста.

 import pandas as pd
import datetime as dt
from pandas.core.frame import DataFrame
import yfinance as yf
import numpy as np
import xlwings as xw

ticker = "^NSEI"
# getting Intraday data for plotting 15 minutes and 75 minutes chart
en = dt.date.today()   dt.timedelta(days=1)
st = en - dt.timedelta(days=30)
df = yf.download(ticker,start = st, end=en, interval = '15m')
.drop(['Open', 'Close', 'Adj Close', 'Volume'], axis = 1).reset_index()
df['Datetime'] = pd.to_datetime(df['Datetime'].astype(str).str[:-6])
df['Time'] = df['Datetime'].dt.time


print(df)
 

Комментарии:

1. df[~df[‘Время’] == «15:30:00»]

2. Это то, что вы ищете df[~df['Time'].str.contains('15:30:00')]

Ответ №1:

Поскольку Pandas также обеспечивает векторизованные строковые операции во фрейме данных, таким образом, легко получить строки, содержащие строку:

Фрейм данных

 >>> df
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
4  6/15/2021 15:30  15869.25000  15869.25000  15:30:00
 

Результат:

Способ первый:

С помощью str.contains

 >>> df[~df['Time'].str.contains('15:30:00')]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

если вы ищете на основе Datetime

 >>> df[~df['Datetime'].str.contains('15:30')]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

 >>> df[~df.Time.str.contains("15:30") == True]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

 >>> df[df['Time'].str.contains('15:30') == False]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

 >>> df[df['Time'].str.contains('15:30') == 0]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

Способ второй:

С помощью isin

 >>> df[~df['Time'].isin(['15:30:00'])]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

Способ третий:

С помощью Not equal to of dataframe and other, element-wise (binary operator ne).

 >>> df[df.Time != '15:30:00']
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

 >>> df[df['Time'] != '15:30:00']
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

или

 >>> df[df['Time'].ne('15:30:00')]
          Datetime         High          Low      Time
0  6/15/2021 14:30  15891.04981  15868.04981  14:30:00
1  6/15/2021 14:45  15883.00000  15869.90039  14:45:00
2  6/15/2021 15:00  15881.50000  15866.50000  15:00:00
3  6/15/2021 15:15  15877.75000  15854.54981  15:15:00
 

Комментарии:

1. Спасибо, Приятель. Метод номер один для меня не работает. Другие работали. Ошибка в первом способе . «AttributeError: Может использовать метод доступа .str только со строковыми значениями!»

2. Приятно слышать, счастливого кодирования!

3. Может быть, стоит попробовать df[~df['Time'].astype(str).str.contains('15:30:00')]

Ответ №2:

То, как я это сделал, было следующим,

Сначала мы получаем время, которое мы хотим удалить из набора данных, то есть в данном случае 15:30:00.

Поскольку столбец Datetime имеет формат datetime, мы не можем сравнивать время как строки. Поэтому мы преобразуем заданное время в формат datetime.time ().

rm_time = dt.time(15,30)

С этим мы можем приступить к использованию DataFrame.drop()

df.drop(df[df.Datetime.dt.time == rm_time].index)

Ответ №3:

Вы можете попробовать это:

 import pandas as pd

test_data=pd.read_csv("test.csv")
test_data=test_data[test_data["Time"]!="15:30:00"]
print(test_data)
 

Просто выберите строки в зависимости от условий.