#python #pandas
Вопрос:
Доброе Утро Всем,
У меня очень большой df, но мне нужно удалить данные НЕ между 8.30 утра по восточному времени и 5 вечера по Гринвичу.
# Dates are dd/mm/yyyy df ={ 'rfq_create_date_time': ['01/10/2021 00:00:00 AM', '02/10/2021 01:01:01 AM', '03/10/2021 05:00:00 AM', '04/10/2021 10:15:15 AM', '05/10/2021 01:01:01 PM', '21/10/2021 10:29:29 PM', '22/10/2021 10:30:00 PM', '23/10/2021 10:30:01 PM',], 'Other_Field': ['A', 'B', 'C','D','E','F','G','H',], } df = pd.DataFrame.from_dict(df) print(df)
Требуется df:
rfq_create_date_time Other_Field 2 03/10/2021 05:00:00 AM C 3 04/10/2021 10:15:15 AM D 4 05/10/2021 01:01:01 PM E 5 21/10/2021 10:29:29 PM F 6 22/10/2021 10:30:00 PM G
Первая проблема: я попробовал эту between_time
функцию, но я не хочу, чтобы дата была индексом. Это было добавлено, когда я получал TypeError: Index must be DatetimeIndex
df.index = pd.to_datetime(df['rfq_create_date_time'])
Вторая проблема: я просто хочу выполнить подсчет до и после, но получаю TypeError: bad operand type for unary ~: 'str'
при назначении mask = ~
# Count the number of rows excluded dfUTC_05_To_2230 = ((df['rfq_create_date_time'].between_time('5:00', '22:30'))) print(dfUTC_05_To_2230) Total_UTC_Removed = np.sum(dfUTC_05_To_2230) print(" Total records filtered out due to exclusion of RFQ's from UTC 0500 to UTC 2230 " str(Total_UTC_Removed), end='n') # Mask to exclude these rows mask = ~((df['rfq_create_date_time'].between_time('5:00', '22:30'))) Total_Rows_After_Mask = df.shape[0] Difference = Total_Rows_Db - Total_UTC_Removed - Total_Rows_After_Mask print("Total records in df after exclusion of RFQ's from UTC 0500 to UTC 2230 " str(Total_Rows_After_Mask), end='n') print("Difference after exclusion of RFQ's from UTC 0500 to UTC 2230 " str(Difference), end='n')
Комментарии:
1. Какой часовой пояс используется для даты/времени во фрейме данных? Кроме того, почему бы не использовать pd.to_datetime для преобразования времени
rfq_create_date_time
в дату и время, а не пытаться установить индекс?2. Все даты и время указаны в UTC. 8.30 по восточному времени-2230, а 5 вечера в Лондоне-0500. Проверка pd.to_datetime сейчас
3. Я получаю ошибку типа: индекс должен быть ошибкой DatetimeIndex, если удалить df.index = pd.to_datetime(df[‘rfq_create_date_time’]) и заменить на df[‘rfq_create_date_time’] = pd.to_datetime(df[‘rfq_create_date_time’])
Ответ №1:
Для использования between_time
, как вы, вероятно, поняли, дата/время должны быть индексом фрейма данных.
Если дата/время является столбцом во фрейме данных, вы можете использовать «стандартную» фильтрацию.
from datetime import time import pandas as pd # Dates are dd/mm/yyyy data = { "rfq_create_date_time": [ "01/10/2021 00:00:00 AM", "02/10/2021 01:01:01 AM", "03/10/2021 05:00:00 AM", "04/10/2021 10:15:15 AM", "05/10/2021 01:01:01 PM", "21/10/2021 10:29:29 PM", "22/10/2021 10:30:00 PM", "23/10/2021 10:30:01 PM", ], "Other_Field": [ "A", "B", "C", "D", "E", "F", "G", "H", ], } df = pd.DataFrame.from_dict(data) df["rfq_create_date_time"] = pd.to_datetime(df["rfq_create_date_time"]) mask = (df["rfq_create_date_time"].dt.time >= time(5, 0)) amp; ( df["rfq_create_date_time"].dt.time <= time(23, 30) ) df_filtered = df[~mask] print(df_filtered) print( f"""There were {df.shape[0]} records in the original data, and after filtering there are {df_filtered.shape[0]} records left.""" )
rfq_create_date_time | Другое поле |
---|---|
10/01/2021 00:00:00 | A |
10/02/2021 01:01:01 | B |