2015-02-20 19 views
10

Ich versuche, Zeilen eines Datenrahmens basierend auf einer Datumsspalte zu löschen; [Delivery Date]Pandas - Python, Löschen von Zeilen basierend auf Spalte Datum

Ich muss Zeilen löschen, die älter als 6 Monate sind, aber nicht gleich dem Jahr '1970' sind.

Ich habe 2 Variablen erstellt:

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

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

aber ich weiß nicht, wie Zeilen auf diese beiden Variablen basiert zu löschen, die [Delivery Date] Spalte.

Kann jemand die richtige Lösung bereitstellen?

Antwort

8

Sie können sie nur herausfiltern:

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

Dies gibt alle Zeilen, in denen das Jahr 1970 ist, oder das Datum ist weniger als 6 Monaten.

können Sie boolean Indizierung verwenden und mehrere Bedingungen passieren die df zu filtern, für mehrere Bedingungen müssen Sie die Array-Operatoren verwenden, so | statt or und Klammern um die Bedingungen aufgrund Betreiber Vorrang.

Überprüfen Sie die Dokumentation für eine Erklärung der boolean indexing

+0

Dank .. Ich bin eine Rückkehr Fehler bekommen: Typeerror: ‚Kann nur .dt Accessor verwenden mit datumsgleichen Werten '- braucht wahrscheinlich eine eigene Frage, aber muss ich dann das [Lieferdatum] auf datetime umstellen? Entschuldigung, ich bin ziemlich neu zu diesem –

+0

Sie haben Strings anstelle von datetimes, können Sie tun 'df ['Delivery Date'] = pd.to_datetime (df ['Delivery Date'])' – EdChum

2

Sicherstellen, dass die Berechnung selbst für „6 Monate“ vor genau ist. Sie möchten vielleicht nicht in 188 Tagen hardcoding sein. Nicht alle Monate werden gleich gemacht.

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) 

Dann können Sie die folgende Logik anwenden.

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)] 

Wenn Sie wirklich Abschnitte der Datenrahmen fallen wollen, können Sie wie folgt vorgehen:

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

hey dies ist die Rückkehr der error: drop() benötigt mindestens 2 Argumente, 1 gegeben –

+0

... sollte jetzt gut sein. – andrewwowens

Verwandte Themen