#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)
Просто выберите строки в зависимости от условий.