2016-07-27 8 views
4

Hallo und danke im Voraus für jede Hilfe. Ich habe einen einfachen Datenrahmen mit zwei Spalten. Ich habe keinen Index explizit festgelegt, aber ich glaube, dass ein Datenframe einen ganzzahligen Index erhält, den ich auf der linken Seite der Ausgabe sehe. Frage unter:Pandas Pivot Time-Serie nach Jahr

df = pandas.DataFrame(res) 
df.columns = ['date', 'pb'] 
df['date'] = pandas.to_datetime(df['date']) 
df.dtypes 

date datetime64[ns] 
pb    float64 
dtype: object 


date pb 
0 2016-04-01 24199.933333 
1 2016-03-01 23860.870968 
2 2016-02-01 23862.275862 
3 2016-01-01 25049.193548 
4 2015-12-01 24882.419355 
5 2015-11-01 24577.000000 


date datetime64[ns] 
pb    float64 
dtype: object 

Ich mag den Datenrahmen schwenken, so dass ich Jahre über die Oberseite (Spalten): 2016, 2015 usw. und eine Zeile für jeden Monat: 1 - 12.

Antwort

5

Mit der .dt accessor Sie Spalten für Jahr und Monat und schwenken dann auf diejenigen schaffen:

df['Year'] = df['date'].dt.year 
df['Month'] = df['date'].dt.month 
pd.pivot_table(df,index='Month',columns='Year',values='pb',aggfunc=np.sum) 

Alternativ, wenn Sie Sie tun können, nicht die anderen Spalten wollen:

pd.pivot_table(df,index=df['date'].dt.month,columns=df['date'].dt.year, 
       values='pb',aggfunc=np.sum) 

Mit meiner Dummy-Datenmenge, die produziert:

Year    2013  2014  2015  2016 
date 
1    92924.0 102072.0 134660.0 132464.0 
2    79935.0 82145.0 118234.0 147523.0 
3    86878.0 94959.0 130520.0 138325.0 
4    80267.0 89394.0 120739.0 129002.0 
5    79283.0 91205.0 118904.0 125878.0 
6    77828.0 89884.0 112488.0 121953.0 
7    78839.0 94407.0 113124.0  NaN 
8    79885.0 97513.0 116771.0  NaN 
9    79455.0 99555.0 114833.0  NaN 
10   77616.0 98764.0 115872.0  NaN 
11   75043.0 95756.0 107123.0  NaN 
12   81996.0 102637.0 114952.0  NaN 
+0

Das funktioniert absolut großartig. Ich schätze Ihre Hilfe! –

+1

df.pivot_table (Index = 'Monat', Spalten = 'Jahr', Werte = 'Pb') –

+0

Große Antwort! +1 – piRSquared

2

Mit stack statt pivot

df = pd.DataFrame(
     dict(date=pd.date_range('2013-01-01', periods=42, freq='M'), 
       pb=np.random.rand(42))) 

df.set_index([df.date.dt.month, df.date.dt.year]).pb.unstack() 

enter image description here

+0

Ich habe das Stapeln und Entstapeln noch nicht ganz verstanden. Danke für dieses Beispiel. – bernie

Verwandte Themen