Эффективная фильтрация фреймов данных Pandas по диапазонам дат — это важный навык в анализе данных. Pandas предоставляет несколько способов для этого, каждый со своими преимуществами и недостатками. В этой статье рассматриваются четыре популярных подхода, сравниваются их синтаксис, эффективность и варианты использования.
Оглавление
- Фильтрация с помощью булевых масок
- Использование метода
.query()
- Использование метода
.isin()
- Использование метода
.between()
Фильтрация с помощью булевых масок
Булевы маски предлагают наиболее фундаментальный и гибкий подход. Они создают булевый массив (маску), который фильтрует строки на основе заданных условий. Этот метод очень хорошо подходит для сложных сценариев.
import pandas as pd
data = {'Date': pd.to_datetime(['2023-10-26', '2023-11-15', '2023-12-01', '2024-01-10', '2024-02-20']),
'Value': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
start_date = pd.to_datetime('2023-11-01')
end_date = pd.to_datetime('2024-01-01')
mask = (df['Date'] >= start_date) & (df['Date'] <= end_date)
filtered_df = df[mask] #Более эффективно, чем df.loc[mask]
print(filtered_df)
Использование метода .query()
Метод .query()
предоставляет более читаемую и компактную альтернативу для фильтрации. Он особенно полезен для сложных условий.
start_date = '2023-11-01'
end_date = '2024-01-01'
filtered_df = df.query('@start_date <= Date <= @end_date')
print(filtered_df)
Использование метода .isin()
Метод .isin()
подходит, когда нужно выбрать строки на основе списка конкретных дат, а не непрерывного диапазона. Он менее эффективен для больших непрерывных диапазонов.
dates_to_include = pd.to_datetime(['2023-11-15', '2023-12-01'])
filtered_df = df[df['Date'].isin(dates_to_include)]
print(filtered_df)
Использование метода .between()
Метод .between()
предлагает упрощенный подход для выбора строк в непрерывном диапазоне дат. Он эффективен и легко читается.
start_date = pd.to_datetime('2023-11-01')
end_date = pd.to_datetime('2024-01-01')
filtered_df = df[df['Date'].between(start_date, end_date, inclusive='both')] #аргумент inclusive добавлен для ясности
print(filtered_df)
В заключение, Pandas предлагает различные методы для фильтрации по датам. Оптимальный выбор зависит от ваших конкретных потребностей и стиля кодирования. Булевы маски обеспечивают максимальную гибкость, .query()
повышает читаемость, а .between()
упрощает выбор непрерывного диапазона. Помните, что для оптимальной производительности ваш столбец дат должен иметь тип datetime64
.