2017-12-16 2 views
2

Ich habe eine pandas.DataFrame enthält mehrere Rechnungen von mehreren Kunden. Ich möchte eine elegante Möglichkeit finden, die Zeit zwischen 2 Rechnungen je nach Kunde zu berechnen.Wie bekomme ich den Zeitunterschied zwischen Index, mehrere Rechnungen - Pandas

Mein Datenrahmen sieht wie folgt aus (Index ist die Rechnungsnummer, die letzte Spalte ist das, was ich erwarte):

  CustomerID   InvoiceDate time between 2 orders 
index         
536365  17850.0 2010-12-01 08:26:00 0 minutes (or np.nat) 
536366  17850.0 2010-12-01 08:28:00 2 minutes 
536367  13047.0 2010-12-01 08:34:00 0 minutes (It's a new customer) 
536369  13047.0 2010-12-01 08:35:00 1 minute 
536371  13748.0 2010-12-01 09:00:00 0 minute (new customer) 
536372  17850.0 2010-12-01 09:01:00 33 minutes (see line #2) 
536373  17850.0 2010-12-01 09:02:00 1 minute 
536374  15100.0 2010-12-01 09:09:00 0 minute 

Dies ist, was ich bisher gefunden (aber offensichtlich funktioniert es nicht !)

df = df.sort_values(['CustomerID', 'InvoiceDate']) #To order first according 
df = df.set_index('index', drop = True) 
for CustomerID in df['CustomerID'].unique(): 
    index = df.set_index('CustomerID').index.get_loc(CustomerID) 
    df['Ordersep'].iloc[index] = df['InvoiceDate'].iloc[index].diff() 

Irgendeine Idee, mir zu helfen?

Antwort

2

Sie können groupby() mit diff() verwenden:

df.InvoiceDate = pd.to_datetime(df.InvoiceDate) 
df["timedelta"] = df.groupby(["CustomerID"]).InvoiceDate.apply(lambda x: x.diff()) 

df 
    index CustomerID   InvoiceDate timedelta 
0 536365  17850.0 2010-12-01 08:26:00   NaT 
1 536366  17850.0 2010-12-01 08:28:00  00:02:00 
2 536367  13047.0 2010-12-01 08:34:00   NaT 
3 536369  13047.0 2010-12-01 08:35:00  00:01:00 
4 536371  13748.0 2010-12-01 09:00:00   NaT 
5 536372  17850.0 2010-12-01 09:01:00  00:33:00 
6 536373  17850.0 2010-12-01 09:02:00  00:01:00 
7 536374  15100.0 2010-12-01 09:09:00   NaT 
+0

Bingo! Sobald Sie die Lösung sehen, scheint es immer offensichtlich. –

0

Dies sollte unter der Annahme arbeiten, dass Sie sich auf Kundennummer und Rechnungsdatum dieser Stand sortiert haben (mit ein wenig Feintuning vielleicht)

for customer_id in df.CustomerId.unique(): 
    matching_customer_mask = df.CustomerId == customer_id 
    customer_df = df[matching_customer_mask] 

    order_times = customer_df.InvoiceDate 
    prev_order_times = customer_df.InvoiceDate.shift(1) 

    df.loc[matching_customer_mask, 'Ordersep'] = order_times - prev_order_times 

Was dies tut, ist es das Rechnungsdatum Spalte einen Schritt verschiebt sich nach unten, und berechnet dann den gewünschten Unterschied.

Verwandte Themen