2017-09-08 4 views
0

ich einen Datenrahmen wie solche haben:für Datum und Uhrzeit Upsampling

rows = [['bob', '01/2017', 12], 
     ['bob', '02/2017', 14], 
     ['bob', '03/2017', 16], 
     ['julia', '01/2017', 18], 
     ['julia', '02/2017', 16], 
     ['julia', '03/2017', 24]] 

df = pd.DataFrame(rows, columns = ['name','date','val']) 

Unter der Annahme, dass jeder Monat 4 Wochen hat (ich werde eine Lookup verwenden Monat num Wochen passen, aber der Einfachheit halber annehmen, 4), ich erstellen möchten eine Zeile für jede Person für jede Woche des Monats, wobei der Wert der Monatwert geteilt durch 4 (oder n_Wochen) ist.

Ich versuchte mit .resample() und .asfreq() aber sie sagten mir, ich brauche einen eindeutigen Index.

Wie kann ich das in Pandas machen?

EDIT

Ok, so dass ich diese bekam:

weekly = df.groupby('name').apply(lambda g: g.set_index('date').resample('w').pad().reset_index()).reset_index(drop=True) 

weekly.val/4 

    date name val 
0 2017-01-01 bob 3 
1 2017-01-08 bob 3 
2 2017-01-15 bob 3 
3 2017-01-22 bob 3 
4 2017-01-29 bob 3 
5 2017-02-05 bob 3.5 
6 2017-02-12 bob 3.5 
7 2017-02-19 bob 3.5 
8 2017-02-26 bob 3.5 
9 2017-03-05 bob 4 
10 2017-01-01 julia 4.5 
11 2017-01-08 julia 4.5 
12 2017-01-15 julia 4.5 
13 2017-01-22 julia 4.5 
14 2017-01-29 julia 4.5 
15 2017-02-05 julia 4 
16 2017-02-12 julia 4 
17 2017-02-19 julia 4 
18 2017-02-26 julia 4 
19 2017-03-05 julia 6 

Mein Problem ist nach wie vor, dass es den im letzten Monat von jeder Gruppe nicht ist zu verteilen.

+0

Ich bin verwirrt. Bitte zeigen Sie uns, wie die Ergebnisse aussehen würden, wenn Sie die von Ihnen zur Verfügung gestellte Probe betrachten. – piRSquared

+0

hat einen Schnitt gemacht - hat das geklärt? – RSHAP

Antwort

0

So antwortete jemand dies zum Teil aber gelöscht es dann, bevor ich es kopieren können, aber ich glaube, ich herausgefunden, was sie für wollten:

So aus diesem Datenrahmen (erstellt in der Frage)

name date val 
0 bob 01/2017 12 
1 bob 02/2017 14 
2 bob 03/2017 16 
3 julia 01/2017 18 
4 julia 02/2017 16 
5 julia 03/2017 24 

ich tun kann:

from pandas.tseries.offsets import * 
df['date']=pd.to_datetime(df.date) 

min_date = df.date.min()+MonthBegin(0) 
max_date = df.date.max()+MonthEnd(0) 
dr = pd.date_range(min_date, max_date,freq='w') 

weekly = df.groupby('name').apply(lambda g: g.set_index('date') 
     .reindex(dr,method='pad').reset_index()).reset_index(drop=True) 

und bekommen

index  name val 
0 2017-01-01 bob 12 
1 2017-01-08 bob 12 
2 2017-01-15 bob 12 
3 2017-01-22 bob 12 
4 2017-01-29 bob 12 
5 2017-02-05 bob 14 
6 2017-02-12 bob 14 
7 2017-02-19 bob 14 
8 2017-02-26 bob 14 
9 2017-03-05 bob 16 
10 2017-03-12 bob 16 
11 2017-03-19 bob 16 
12 2017-03-26 bob 16 
13 2017-01-01 julia 18 
14 2017-01-08 julia 18 
15 2017-01-15 julia 18 
16 2017-01-22 julia 18 
17 2017-01-29 julia 18 
18 2017-02-05 julia 16 
19 2017-02-12 julia 16 
20 2017-02-19 julia 16 
21 2017-02-26 julia 16 
22 2017-03-05 julia 24 
23 2017-03-12 julia 24 
24 2017-03-19 julia 24 
25 2017-03-26 julia 24