2015-10-26 4 views
6

Ich habe ein Pandas DataFrame mit einer TIMESTAMP Spalte, die vom Datentyp Datetime64 ist. Bitte beachten Sie, dass diese Spalte zunächst nicht als Index festgelegt wird. der Index nur regelmäßige ganze Zahlen sind, und die ersten paar Zeilen wie folgt aussehen:Durchschnitt der täglichen Anzahl der Datensätze pro Monat in einem Pandas DataFrame

 TIMESTAMP     TYPE 
0 2014-07-25 11:50:30.640 2 
1 2014-07-25 11:50:46.160 3 
2 2014-07-25 11:50:57.370 2 

Es gibt eine beliebige Anzahl von Datensätzen für jeden Tag, und es kann Tage ohne Daten sein. Was ich versuche zu erhalten, ist die durchschnittliche Anzahl der täglichen Aufzeichnungen pro Monat dann plotten Sie es als Balkendiagramm mit Monaten in der x-Achse (April 2014, Mai 2014 ... etc.). Ich schaffte es, diese Werte unter

dfWIM.index = dfWIM.TIMESTAMP  
for i in range(dfWIM.TIMESTAMP.dt.year.min(),dfWIM.TIMESTAMP.dt.year.max()+1): 
    for j in range(1,13): 
     print dfWIM[(dfWIM.TIMESTAMP.dt.year == i) & (dfWIM.TIMESTAMP.dt.month == j)].resample('D', how='count').TIMESTAMP.mean() 

mit dem Code zu berechnen, das die folgenden Ausgabe gibt:

nan 
nan 
3100.14285714 
6746.7037037 
9716.42857143 
10318.5806452 
9395.56666667 
9883.64516129 
8766.03225806 
9297.78571429 
10039.6774194 
nan 
nan 
nan 

Das ist in Ordnung, wie es ist, und mit etwas mehr Arbeit, kann ich zu den Ergebnissen der Karte zu korrigieren Monatsnamen, dann plotten Sie das Balkendiagramm. Ich bin mir jedoch nicht sicher, ob dies der richtige/beste Weg ist, und ich vermute, dass es einen einfacheren Weg geben könnte, die Ergebnisse mit Pandas zu erzielen.

Ich würde mich freuen zu hören, was Sie denken. Vielen Dank!

HINWEIS: Wenn ich die TIMESTAMP-Spalte nicht als den Index festlegen, erhalte ich eine "Reduktionsoperation" bedeutet "nicht für diesen dtype" -Fehler zulässig.

Antwort

8

Ich denke, Sie wollen zwei Runden von groupby machen, zuerst nach Tag gruppieren und die Instanzen zählen, und neben der Gruppe nach Monat und berechnen Sie den Mittelwert der täglichen zählt. Du könntest so etwas tun.

Zunächst werde ich einige gefälschte Daten erzeugen, die wie Ihre aussieht:

import pandas as pd 

# make 1000 random times throughout the year 
N = 1000 
times = pd.date_range('2014', '2015', freq='min') 
ind = np.random.permutation(np.arange(len(times)))[:N] 

data = pd.DataFrame({'TIMESTAMP': times[ind], 
        'TYPE': np.random.randint(0, 10, N)}) 
data.head() 

enter image description here

Jetzt werde ich die beiden groupbys tun pd.TimeGrouper mit und zeichnen Sie die monatlichen Durchschnitt zählt:

import seaborn as sns # for nice plot styles (optional) 

daily = data.set_index('TIMESTAMP').groupby(pd.TimeGrouper(freq='D'))['TYPE'].count() 
monthly = daily.groupby(pd.TimeGrouper(freq='M')).mean() 
ax = monthly.plot(kind='bar') 

enter image description here

Die Formatierung entlang der X-Achse lässt etwas zu wünschen übrig, aber Sie können das bei Bedarf optimieren.

+0

Ich konnte nicht herausfinden, wie man es mit 'groupby' macht. Stellt sich heraus, TimeGroup ist der Trick. Danke vielmals! – marillion

+0

Formatierung entlang der x-Achse für das Balkendiagramm mit Zeitreihen war viel schwieriger als ich dachte. Die Lösung ist http://StackOverflow.com/Questions/33642388/Pandas-Bar-Plot-with-Multiindex-Dataframe, wenn jemand am selben Punkt feststeckt. – marillion