Filtra le righe di DataFrame in base alla data in Pandas

Suraj Joshi 30 gennaio 2023
  1. Seleziona righe tra due date con maschera booleana
  2. pandas.DataFrame.query() per selezionare le righe DataFrame tra due date
  3. pandas.DataFrame.isin() per selezionare le righe DataFrame tra due date
  4. pandas.Series.between() per selezionare le righe DataFrame tra due date
Filtra le righe di DataFrame in base alla data in Pandas

Possiamo filtrare le righe DataFrame in base alla data in Pandas usando la maschera booleana con il metodo loc e l’indicizzazione DataFrame. Potremmo anche usare i metodi query, isin e between per gli oggetti DataFrame per selezionare le righe in base alla data in Pandas.

Seleziona righe tra due date con maschera booleana

Per filtrare le righe DataFrame in base alla data in Pandas utilizzando la maschera booleana, inizialmente creiamo una maschera booleana utilizzando la sintassi:

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

Dove start_date e end_date sono entrambi in formato datetime e rappresentano l’inizio e la fine dell’intervallo da cui i dati devono essere filtrati. Quindi selezioniamo la parte di DataFrame che si trova all’interno dell’intervallo utilizzando il metodo 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)

Produzione:

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

Possiamo semplificare il processo di cui sopra utilizzando il metodo integrato df.loc[start_date:end_date] impostando la colonna della data come colonna dell’indice.

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)

Produzione:

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

pandas.DataFrame.query() per selezionare le righe DataFrame tra due date

Possiamo anche filtrare le righe DataFrame in base alla data in Pandas utilizzando il metodo pandas.DataFrame.query(). Il metodo restituisce un DataFrame risultante dall’espressione di query fornita.

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)

Produzione:

      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() per selezionare le righe DataFrame tra due date

Metodo pandas.DataFrame.isin() restituisce il Dataframe di valori booleani che rappresentano se l’elemento si trova o meno nell’intervallo specificato. Possiamo utilizzare questo metodo per filtrare le righe DataFrame in base alla data in 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)

Produzione:

      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() restituisce un DateTimeIndex fisso. Il suo primo parametro è la data di inizio e il secondo parametro è la data di fine.

pandas.Series.between() per selezionare le righe DataFrame tra due date

Possiamo anche usare pandas.Series.between() per filtrare DataFrame in base alla data. Il metodo restituisce un vettore booleano che rappresenta se l’elemento della serie si trova o meno nell’intervallo specificato. Passiamo così ottenuto il vettore booleano al metodo loc() per estrarre DataFrame.

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)

Produzione:

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

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

LinkedIn