Pandas の日付に基づいて DataFrame 行をフィルタリングする方法

Suraj Joshi 2023年1月30日
  1. ブールマスクを使用して 2つの日付の間の行を選択する
  2. 2つの日付の間の DataFrame 行を選択するための pandas.DataFrame.query()
  3. 2つの日付の間の DataFrame 行を選択するための pandas.DataFrame.isin()
  4. 2つの日付間の DataFrame 行を選択するための pandas.Series.between()
Pandas の日付に基づいて DataFrame 行をフィルタリングする方法

loc メソッドと DataFrame インデックスを使用したブールマスクを使用して、Pandas の日付に基づいて DataFrame 行をフィルタリングできます。また、DataFrame オブジェクトの queryisin、および between メソッドを使用して、Pandas の日付に基づいて行を選択することもできます。

ブールマスクを使用して 2つの日付の間の行を選択する

ブールマスクを使用して Pandas の日付に基づいて DataFrame 行をフィルター処理するには、最初に次の構文を使用してブールマスクを作成します。

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

ここで、start_dateend_date はどちらも datetime 形式で、データをフィルターする必要がある範囲の開始と終了を表します。次に、df.loc() メソッドを使用して、範囲内にある 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"]
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)

出力:

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

日付列をインデックス列として設定することにより、統合された df.loc[start_date:end_date] メソッドを使用して上記のプロセスを簡略化できます。

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)

出力:

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

2つの日付の間の DataFrame 行を選択するための pandas.DataFrame.query()

pandas.DataFrame.query() を使用して、Pandas の日付に基づいて DataFrame 行をフィルタリングすることもできますメソッド。このメソッドは、指定されたクエリ式の結果である 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.query("Joined_date >= '2019-06-1' and Joined_date <='2020-02-05'")
print(filtered_df)

出力:

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

2つの日付の間の DataFrame 行を選択するための pandas.DataFrame.isin()

pandas.DataFrame.isin() は、要素かどうかを表すブール値の DataFrame を返します指定された範囲内にあるかどうか。このメソッドを使用して、Pandas の日付に基づいて 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[df["Joined_date"].isin(pd.date_range("2019-06-1", "2020-02-05"))]
print(filtered_df)

出力:

      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() は固定された DateTimeIndex を返します。最初のパラメーターは開始日、2 番目のパラメーターは終了日です。

2つの日付間の DataFrame 行を選択するための pandas.Series.between()

pandas.Series.between() を使用して、日付に基づいて DataFrame をフィルタリングすることもできますこのメソッドは、系列要素が指定された範囲内にあるかどうかを表すブールベクトルを返します。このようにして取得したブールベクトルを loc() メソッドに渡して、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)

出力:

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

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

LinkedIn

関連記事 - Pandas DateTime