2017-06-13 35 views
3

我有一個包含4年數據的csv文件,我試圖在4年內對每個季節的數據進行分組,不同地說,我需要總結和繪製我的整個數據到4只有季節。 這裏是我的數據文件一看:根據確切日期按季節分組數據

timestamp,heure,lat,lon,impact,type 
2006-01-01 00:00:00,13:58:43,33.837,-9.205,10.3,1 
2006-01-02 00:00:00,00:07:28,34.5293,-10.2384,17.7,1 
2007-02-01 00:00:00,23:01:03,35.0617,-1.435,-17.1,2 
2007-02-02 00:00:00,01:14:29,36.5685,0.9043,36.8,1 
2008-01-01 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 
2008-01-02 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 
.... 
2011-12-31 00:00:00,05:03:51,34.1919,-12.5061,-48.9,1 

,這裏是我想要的輸出:

winter  (the mean value of impacts) 
summer  (the mean value of impacts) 
autumn  .... 
spring  ..... 

其實我已經試過這段代碼:

names =["timestamp","heure","lat","lon","impact","type"] 
data = pd.read_csv('flash.txt',names=names, parse_dates=['timestamp'],index_col=['timestamp'], dayfirst=True) 

spring = range(80, 172) 
summer = range(172, 264) 
fall = range(264, 355) 

def season(x): 
    if x in spring: 
     return 'Spring' 
    if x in summer: 
     return 'Summer' 
    if x in fall: 
     return 'Fall' 
    else : 
     return 'Winter' 

data['SEASON'] = data.index.to_series().dt.month.map(lambda x : season(x)) 
data['impact'] = data['impact'].abs() 
seasonly = data.groupby('SEASON')['impact'].mean() 

和我得到這個可怕的結果: enter image description here

其中我錯了嗎?

回答

2

您需要DatetimeIndex.dayofyear

data['SEASON'] = data.index.dayofyear.map(season) 

pandas.cut另一種解決方案:

bins = [0, 91, 183, 275, 366] 
labels=['Winter', 'Spring', 'Summer', 'Fall'] 
doy = data.index.dayofyear 
data['SEASON1'] = pd.cut(doy + 11 - 366*(doy > 355), bins=bins, labels=labels) 
+0

是的,它的工作,謝謝@jezrael –

+0

@piRSquared - 謝謝,我正在努力。 – jezrael

2

的樣子:

data['SEASON'] = data.index.to_series().dt.**month**.map(lambda x : season(x)) 

使用一個月大概1-12或0-11這些都是 「冬天」。 您需要使用一年中的某一天。

但是,您可能更容易看到這一點,並且可以自己打印以便檢查它是否可以在一行內鎖定一天的提取。只是說。

+0

是的,你是絕對正確的,我只是打印檢查,他們都是冬天,我怎麼能寫一年的一天,你說的嗎? –

+0

它現在工作,非常感謝你 –

3

pandas.cut
爲了妥善處理'Winter'既是在今年的開始和結束,我將dayofyear轉爲11,並將結果mod ulo 366。我之所以不使用與以下numpy解決方案相同的技術,是因爲pd.cut返回一個分類類型,我最終將得到5個類別,其中兩個類別具有相同的標籤。然後,我可以把結果作爲字符串,但感覺馬虎。

data['SEASON'] = pd.cut(
    (data.index.dayofyear + 11) % 366, 
    [0, 91, 183, 275, 366], 
    labels=['Winter', 'Spring', 'Summer', 'Fall'] 
) 

numpy.searchsorted
爲了妥善處理'Winter'之初並在今年年底既是,我讓兩個區間爲'Winter'

seasons = np.array(['Winter', 'Spring', 'Summer', 'Fall', 'Winter']) 
f = np.searchsorted([80, 172, 264, 355], data.index.dayofyear) 
data['SEASON'] = seasons[f] 

plot

data.groupby('SEASON')['impact'].mean().plot.bar() 

enter image description here

+0

我照你說的做了,我得到這個錯誤:'numpy.ndarray'對象沒有任何屬性'值' –

+0

@MarieAntoinette我忘了你是在'pandas'的舊版本...將在第二次更新... 。 現在就試試。 – piRSquared

+0

哈哈噢耶,你還記得,非常感謝你編輯現在的工作 –