web-dev-qa-db-ja.com

Pandas-Python、日付列に基づいて行を削除

1つの日付列に基づいてデータフレームの行を削除しようとしています。 [Delivery Date]

6か月以上古いが「1970」年に等しくない行を削除する必要があります。

2つの変数を作成しました。

from datetime import date, timedelta
sixmonthago = date.today() - timedelta(188)

import time
nineteen_seventy = time.strptime('01-01-70', '%d-%m-%y')

しかし、[Delivery Date]列を使用して、これらの2つの変数に基づいて行を削除する方法がわかりません。

誰かが正しい解決策を提供できますか?

13
Colin O'Brien

あなたはそれらを取り除くことができます:

df[(df['Delivery Date'].dt.year == 1970) | (df['Delivery Date'] >= sixmonthago)]

これは、年が1970であるか、日付が6か月未満のすべての行を返します。

ブールインデックスを使用し、複数の条件を渡してdfをフィルタリングできます。複数の条件については、配列演算子を使用する必要があるため、|の代わりにorを使用し、演算子の優先順位のために条件を括弧で囲みます。

boolean indexing の説明については、ドキュメントを確認してください

14
EdChum

計算自体が「6か月」前まで正確であることを確認してください。 188日以内にハードコーディングしたくない場合があります。すべての月が同じように作られるわけではありません。

from datetime import date
from dateutil.relativedelta import relativedelta

#http://stackoverflow.com/questions/546321/how-do-i-calculate-the-date-six-months-from-the-current-date-using-the-datetime
six_months = date.today() - relativedelta( months = +6 )

その後、次のロジックを適用できます。

import time
nineteen_seventy = time.strptime('01-01-70', '%d-%m-%y')

df = df[(df['Delivery Date'].dt.year == nineteen_seventy.tm_year) | (df['Delivery Date'] >= six_months)]

データフレームのセクションを本当に削除したい場合は、以下を実行できます。

df = df[(df['Delivery Date'].dt.year != nineteen_seventy.tm_year) | (df['Delivery Date'] < six_months)].drop(df.columns)
2
andrewwowens