HOWTO · Pandas
Pandas の日付に基づいて DataFrame 行をフィルタリングする方法
ブールマスク、クエリメソッド、isin メソッド、および between メソッドを使用して、Pandas の日付に基づいて DataFrame 行をフィルター処理できます。
loc メソッドと DataFrame インデックスを使用したブールマスクを使用して、Pandas の日付に基づいて DataFrame 行をフィルタリングできます。また、DataFrame オブジェクトの query、isin、および between メソッドを使用して、Pandas の日付に基づいて行を選択することもできます。
ブールマスクを使用して 2つの日付の間の行を選択する
ブールマスクを使用して Pandas の日付に基づいて DataFrame 行をフィルター処理するには、最初に次の構文を使用してブールマスクを作成します。
mask = (df["col"] > start_date) & (df["col"] <= end_date)
ここで、start_date と end_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