Como filtrar linhas DataFrame com base na data em Pandas

Suraj Joshi 30 janeiro 2023
  1. Selecionar Linhas entre duas datas com máscara booleana
  2. pandas.DataFrame.query() para selecionar linhas DataFrame entre duas datas
  3. pandas.DataFrame.isin() para selecionar DataFrame Linhas entre duas datas
  4. pandas.Series.between() para selecionar linhas de DataFrame entre duas datas
Como filtrar linhas DataFrame com base na data em Pandas

Podemos filtrar as linhas DataFrame com base na data em Pandas utilizando a máscara booleana com o método local e indexação DataFrame. Também podemos utilizar os métodos query, isin e between para objetos DataFrame para selecionar linhas com base na data em Pandas.

Selecionar Linhas entre duas datas com máscara booleana

Para filtrar as linhas DataFrame com base na data em Pandas usando a máscara booleana, a princípio criamos a máscara booleana usando a sintaxe:

mask = (df["col"] > start_date) & (df["col"] <= end_date)

Onde start_date e end_date estão ambos no formato datetime, e representam o início e o fim do intervalo a partir do qual os dados têm que ser filtrados. Então selecionamos a parte do DataFrame que está dentro do intervalo utilizando o método df.loc().

import pandas as pd
import numpy as np
import datetime

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
df = pd.DataFrame({"Joined date": pd.to_datetime(list_of_dates)}, index=employees)

mask = (df["Joined date"] > "2019-06-1") & (df["Joined date"] <= "2020-02-05")
filtered_df = df.loc[mask]
print(filtered_df)

Resultado:

        Joined date
Hisila   2019-11-20
Shristi  2020-01-02
Zeppy    2020-02-05

Podemos simplificar o processo acima utilizando o método integrado df.loc[start_date:end_date], definindo a coluna de data como uma coluna de índice.

import pandas as pd
import numpy as np
import datetime

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined date": pd.to_datetime(list_of_dates), "Salary": salary}
)
df = df.set_index(["Joined date"])

filtered_df = df.loc["2019-06-1":"2020-02-05"]
print(filtered_df)

Resultado:

                Name  Salary
Joined date                 
2019-11-20    Hisila     200
2020-01-02   Shristi     400
2020-02-05     Zeppy     300

pandas.DataFrame.query() para selecionar linhas DataFrame entre duas datas

Também podemos filtrar as linhas DataFrame com base na data em Pandas utilizando o método pandas.DataFrame.query(). O método retorna um DataFrame resultante da expressão de consulta fornecida.

import pandas as pd
import numpy as np
import datetime

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined_date": pd.to_datetime(list_of_dates), "Salary": salary}
)

filtered_df = df.query("Joined_date >= '2019-06-1' and Joined_date <='2020-02-05'")
print(filtered_df)

Resultado:

      Name Joined_date  Salary
0   Hisila  2019-11-20     200
1  Shristi  2020-01-02     400
2    Zeppy  2020-02-05     300

pandas.DataFrame.isin() para selecionar DataFrame Linhas entre duas datas

pandas.DataFrame.isin() retorna o Dataframe de booleanos que representa se o elemento está ou não no intervalo especificado. Podemos utilizar este método para filtrar as linhas DataFrame com base na data em Pandas.

import pandas as pd
import numpy as np
import datetime

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined_date": pd.to_datetime(list_of_dates), "Salary": salary}
)


filtered_df = df[df["Joined_date"].isin(pd.date_range("2019-06-1", "2020-02-05"))]
print(filtered_df)

Resultado:

      Name Joined_date  Salary
0   Hisila  2019-11-20     200
1  Shristi  2020-01-02     400
2    Zeppy  2020-02-05     300

pandas.date_range() retorna um fixo DateTimeIndex. Seu primeiro parâmetro é a data inicial, e o segundo parâmetro é a data final.

pandas.Series.between() para selecionar linhas de DataFrame entre duas datas

Também podemos utilizar pandas.Series.between() para filtrar DataFrame com base na data. O método retorna um vetor booleano que representa se o elemento em série está ou não no intervalo especificado. O método retorna um vetor booleano que representa se o elemento em série está ou não na faixa especificada.

import pandas as pd
import numpy as np
import datetime

list_of_dates = [
    "2019-11-20",
    "2020-01-02",
    "2020-02-05",
    "2020-03-10",
    "2020-04-16",
    "2020-05-01",
]
employees = ["Hisila", "Shristi", "Zeppy", "Alina", "Jerry", "Kevin"]
salary = [200, 400, 300, 500, 600, 300]
df = pd.DataFrame(
    {"Name": employees, "Joined_date": pd.to_datetime(list_of_dates), "Salary": salary}
)

filtered_df = df.loc[df["Joined_date"].between("2019-06-1", "2020-02-05")]
print(filtered_df)

Resultado:

      Name Joined_date  Salary
0   Hisila  2019-11-20     200
1  Shristi  2020-01-02     400
2    Zeppy  2020-02-05     300
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn