Исключите строки df, в которых поле даты: время/секунды находится между определенным периодом

#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