2017-06-13 6 views
3

Ich habe eine CSV-Datei mit 4 Jahren Daten und ich versuche, Daten pro Saison über die 4 Jahre zu gruppieren, anders gesagt, ich muss zusammenfassen und meine gesamten Daten in 4 nur Jahreszeit. hier ist ein Blick auf meine Datendatei:Gruppendaten nach Saison nach den genauen Daten

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 

und hier ist meine gewünschte Ausgabe:

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

Eigentlich habe ich versucht, diesen Code habe:

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

und ich habe diese schreckliche Ergebnis : enter image description here

wo Bin ich falsch?

Antwort

2

Sie benötigen DatetimeIndex.dayofyear:

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

Eine andere Lösung mit 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

ja es funktioniert, danke @jezrael –

+0

@piRSquared - danke, ich arbeite daran. – jezrael

2

Sieht aus wie:

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

den Monat vermutlich 1-12 oder 0-11 verwendet, die alle "Winter" sind. Sie müssen den Tag des Jahres verwenden.

Aber Sie könnten wahrscheinlich dies leichter gesehen haben und es möglich gemacht, zu drucken, um es selbst zu überprüfen, wenn Sie die Extraktion des Tages in einem Einliner nicht gesperrt hatten. Sag es einfach.

+0

ja Sie absolut richtig sind, ich zu drucken, um nur zu überprüfen und sie sind alle Winter, wie kann ich den Tag des Jahres schreiben, wie Sie gesagt haben? –

+0

es funktioniert jetzt, vielen Dank –

3

pandas.cut
Um 'Winter' beide richtig zu handhaben zu Beginn und zum Ende des Jahres zu sein, Ich habe die dayofyear um 11 verschoben und die Ergebnisse mod ulo 366. Der Grund, warum ich nicht die gleiche Technik wie in der numpy Lösung unten verwende, ist, dass pd.cut einen kategorischen Typ zurückgibt und ich würde mit 5 Kategorien enden, in denen zwei Kategorien das gleiche Label hatten. Ich könnte dann das Ergebnis als String darstellen, aber das fühlte sich schlampig an.

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

numpy.searchsorted
Um 'Winter' beide richtig zu behandeln des Jahres am Anfang und Ende ist, ließ ich zwei Behälter für '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

Ich habe getan, wie Sie sagten, und ich habe diesen Fehler: 'numpy.darray' Objekt hat kein Attribut 'Werte' –

+0

@MarieAntoinette Ich vergesse, Sie sind auf einer älteren Version von 'Pandas' ... wird in einem zweiten Update ... . Probieren Sie es jetzt. – piRSquared

+0

haha ​​oh yeah, erinnerst du dich noch, vielen Dank für die Bearbeitung, es funktioniert jetzt –