2015-10-26 29 views
6

içinde aylık günlük kayıtların günlük ortalama veri sayısı datetime64 veri türü olan bir TIMESTAMP sütun ile DataFrame var. Lütfen unutmayın, başlangıçta bu sütun indeks olarak ayarlanmamıştır; endeks tıpkı normal tamsayı olduğunu ve ilk birkaç satır şuna benzer:Bir 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 

her gün için kayıtların keyfi bir sayı vardır ve hiçbir veriyle gün olabilir. Almaya çalıştığım şey, aydaortalama günlük kayıt sayısıdır, ardından x ekseninde aylar olan bir çubuk grafik olarak çizim yapar (Nisan 2014, Mayıs 2014 ... vb.). Aşağıdaki çıktıyı verir

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() 

aşağıdaki kodu kullanarak bu değerleri hesaplamak başardı:

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

olduğu gibi bu ok ve biraz daha çalışma ile, ben düzeltmek için sonuçlarına eşleyebilirler Ay isimleri, sonra çubuk grafik çizin. Ancak, bunun doğru/en iyi yol olup olmadığından emin değilim ve Panda'ları kullanarak sonuçları elde etmenin daha kolay bir yolu olabileceğinden şüpheleniyorum.

Ne düşündüğünü duymaktan memnun olurum. Teşekkürler!

NOT: TIMESTAMP sütununu dizin olarak ayarlamazsam, "bu işlem için" izin verilmez "hatası alırım.

cevap

8

Sanırım her gün gruplamak ve örnekleri saymak için, ay başına grup yanında ve günlük sayımların ortalamasını hesaplamak için iki tur groupby yapmak isteyeceksiniz. Böyle bir şey yapabilirsin.

Önce sizinki gibi görünüyor bazı sahte veriler elde edersiniz:

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

Şimdi pd.TimeGrouper kullanarak iki groupbys yapacağız ve aylık ortalama sayımları çizmek:

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

x ekseni boyunca biçimlendirme istenen bir şey bırakır, ancak gerekirse onu değiştirebilirsiniz.

+0

"groupby" kullanarak nasıl yapılacağını anlayamadım. 'TimeGrouper' ortaya çıktığında hile. Çok teşekkürler! Zaman serileri ile çubuk grafik için x ekseni boyunca biçimlendirme – marillion

+0

düşündüğümden çok daha zordu. Birisi aynı noktada sıkışırsa çözüm http://stackoverflow.com/questions/33642388/pandas-bar-plot-with-multiindex-dataframe adresindedir. – marillion