2015-02-20 23 views
10

Sto tentando di eliminare righe di un dataframe in base a una colonna di date; [Delivery Date]Pandas - Python, eliminazione delle righe in base alla colonna Data

Ho bisogno di cancellare righe che hanno più di 6 mesi ma non sono uguali all'anno '1970'.

Ho creato 2 variabili:

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

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

ma non so come eliminare le righe sulla base di queste due variabili, utilizzando la colonna [Delivery Date].

Qualcuno potrebbe fornire la soluzione corretta?

risposta

8

si può semplicemente filtrare:

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

Ciò restituisce tutte le righe in cui l'anno è del 1970 o la data è meno di 6 mesi.

È possibile utilizzare l'indicizzazione booleano e passare più le condizioni per filtrare l'df, per molteplici condizioni è necessario utilizzare gli operatori di matrice così | invece di or, e parentesi che racchiudono le condizioni a causa di precedenza degli operatori.

Controllare la documentazione per una spiegazione di boolean indexing

+0

Grazie .. Sto ricevendo un errore di ritorno: TypeError: 'Può usare solo di accesso .dt con valori datetimelike '- probabilmente ha bisogno di una propria domanda separata ma questo significa che devo cambiare la [Delivery Date] in datetime? Scusa, sono abbastanza nuovo per questo –

+0

Hai mave stringhe invece di datazioni, puoi convertire facendo 'df ['Delivery Date'] = pd.to_datetime (df ['Delivery Date'])' – EdChum

2

Assicurarsi il calcolo in sé è accurata per "6 mesi" precedenti. Potresti non voler eseguire l'hardcoding in 188 giorni. Non tutti i mesi sono fatti allo stesso modo.

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) 

Quindi è possibile applicare la seguente logica.

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

Se veramente si vuole far cadere le sezioni del dataframe, è possibile effettuare le seguenti operazioni:

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

hey sta restituendo il errore: drop() richiede almeno 2 argomenti, 1 dato –

+0

... dovrebbe andare bene ora. – andrewwowens

Problemi correlati