2017-05-24 6 views
4

Ich habe einen Datenrahmen wie dieseWie Python Pandas Datenrahmen in bestimmten Zeitbereich

df

order_date amount 
0 2015-10-02  1 
1 2015-12-21  15 
2 2015-12-24  3 
3 2015-12-26  4 
4 2015-12-27  5 
5 2015-12-28  10 

Ich möchte Summe auf df [ „Menge“] auf Bereich von df [basierend zusammenzufassen“ order_date „] df [“ order_date "] + 6 Tage

order_date amount sum 
0 2015-10-02  1  1 
1 2015-12-21  15  27 //comes from 15 + 3 + 4 + 5 
2 2015-12-24  3  22 //comes from 3 + 4 + 5 + 10 
3 2015-12-26  4  19 
4 2015-12-27  5  15 
5 2015-12-28  10  10 

der Datentyp order_date Date versucht haben ILoc zu verwenden, aber es funktioniert nicht gut ... wenn jemand eine ide hat ein/Beispiel darüber, an wen Sie arbeiten, bitte lassen Sie mich wissen.

+0

wenn 'order_date' irgendeine Art von Datetime-Objekt ist, dass Sie dies versuchen:' von Datetime-Import timedelta' und dann 'df [ 'order_date'] + Timedelta (Tage = 6) ' – Taylor

Antwort

0

Aufbauend auf meinem Kommentar:

from datetime import timedelta 

df['sum'] = 0 
for i in range(len(df)): 
    dt1 = df['order_date'][i] 
    dt2 = dt1 + timedelta(days=6) 
    df['sum'][i] = sum(df['amount'][(df['order_date'] >= dt1) & (df['order_date'] <= dt2)]) 

Es gibt wahrscheinlich eine viel bessere Möglichkeit, dies zu tun, aber es funktioniert ...

0

Es Weg für dieses Problem ist. Es funktioniert .. (ich glaube, es ein viel besserer Weg sein sollte, dies zu tun.)

import pandas as pd 

    df['order_date']=pd.to_datetime(pd.Series(df.order_date)) 
    Temp=pd.DataFrame(pd.date_range(start='2015-10-02', end='2017-01-01'),columns=['STDate']) 
    Temp=Temp.merge(df,left_on='STDate',right_on='order_date',how='left') 
    Temp['amount']=Temp['amount'].fillna(0) 
    Temp.sort(['STDate'],ascending=False,inplace=True) 
    Temp['rolls']=pd.rolling_sum(Temp['amount'],window =7,min_periods=0) 
    Temp.loc[Temp.STDate.isin(df.order_date),:].sort(['STDate'],ascending=True) 


    STDate Unnamed: 0 order_date amount rolls 


0 2015-10-02   0.0 2015-10-02  1.0 1.0 
80 2015-12-21   1.0 2015-12-21 15.0 27.0 
83 2015-12-24   2.0 2015-12-24  3.0 22.0 
85 2015-12-26   3.0 2015-12-26  4.0 19.0 
86 2015-12-27   4.0 2015-12-27  5.0 15.0 
87 2015-12-28   5.0 2015-12-28 10.0 10.0 
0

Set order_date sein DatetimeIndex, so dass Sie df.ix[time1:time2] verwenden, um die Zeitbereich Zeilen zu erhalten, filtern dann amount Spalte und summiere sie.

Sie können versuchen, mit:

from datetime import timedelta 
df = pd.read_fwf('test2.csv') 
df.order_date = pd.to_datetime(df.order_date) 
df =df.set_index(pd.DatetimeIndex(df['order_date'])) 
sum_list = list() 
for i in range(len(df)): 
    sum_list.append(df.ix[df.ix[i]['order_date']:(df.ix[i]['order_date'] + timedelta(days=6))]['amount'].sum()) 
df['sum'] = sum_list 
df 

Ausgang:

  order_date amount sum 
2015-10-02 2015-10-02 1  1 
2015-12-21 2015-12-21 15  27 
2015-12-24 2015-12-24 3  22 
2015-12-26 2015-12-26 4  19 
2015-12-27 2015-12-27 5  15 
2015-12-28 2015-12-28 10  10 
+0

danke, besser als meine Lösung – Wen

0
import datetime 

df['order_date'] = pd.to_datetime(df['order_date'], format='%Y-%m-%d') 
df.set_index(['order_date'], inplace=True) 

# Sum rows within the range of six days in the future 
d = {t: df[(df.index >= t) & (df.index <= t + datetime.timedelta(days=6))]['amount'].sum() 
     for t in df.index} 

# Assign the summed values back to the dataframe 
df['amount_sum'] = [d[t] for t in df.index] 

df ist jetzt:

  amount amount_sum 
order_date      
2015-10-02  1.0   1.0 
2015-12-21 15.0  27.0 
2015-12-24  3.0  22.0 
2015-12-26  4.0  19.0 
2015-12-27  5.0  15.0 
2015-12-28 10.0  10.0 
3

Wenn Pandas rolling erlaubt linksbündige Fenster (default rechts ausgerichtet ist), dann wäre die Antwort ein einfacher Einzeiler: df.set_index('order_date').amount.rolling('7d',min_periods=1,align='left').sum(), jedoch wurde vorausschauend noch nicht implementiert (d. h. rolling akzeptiert keinen Parameter align). Also, der Trick, den ich mir ausgedacht habe, ist, die Daten vorübergehend umzukehren. Lösung:

df.index = pd.to_datetime(pd.datetime.now() - df.order_date) 
df['sum'] = df.sort_index().amount.rolling('7d',min_periods=1).sum() 
df.reset_index(drop=True) 

Ausgang:

order_date amount sum 
0 2015-10-02  1 1.0 
1 2015-12-21  15 27.0 
2 2015-12-24  3 22.0 
3 2015-12-26  4 19.0 
4 2015-12-27  5 15.0 
5 2015-12-28  10 10.0 
Verwandte Themen