2016-05-02 14 views
0

Im Anschluss an Reading CSV file in Pandas with historical dates Ich habe einige CSV-Daten in der Form:Gruppierung Periode Reihenwert in Pandas

Object,Earliest Date 
Object1,01/01/2000 
Object2,01/01/1760 
Object3,01/01/1520 
... 

, die ich jetzt in Pandas gelesen habe (Zeitraum historische Daten zu handhaben verwenden) und eine Reihe erstellen. Ich versuche, die Serie in Jahrzehnte zu zerlegen, stolpere aber darauf, die Periodenwerte in die Formgruppe zu bekommen, erwartet sie. Bisher habe ich versucht (wo s ist die Serie erstellt from_csv):

def dt_parse(s): 
    try: 
    d,m,y = s.split('/') 
    return pd.Period(year=int(y), month=int(m), day=int(d), freq='D') 
    except: 
    return pd.NaT 
s2 = s['Earliest Date'].apply(dt_parse) #Create Period values 
pi = pd.PeriodIndex(s2) 
decades = pi.groupby(pd.Grouper(freq="120M")).count() 

, die mit fehlschlägt:

TypeError: Argument 'labels' has incorrect type (expected numpy.ndarray, got TimeGrouper) 

zur Gruppe Der Versuch, auf sie als Serie:

decades = s2.groupby(pd.Grouper(freq="120M")).count() 

schlägt fehl mit:

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index' 

Versuch zu Gruppe auf sie als Datenrahmen:

df = pd.DataFrame(s2) 
decades = df.groupby(pd.Grouper(freq="120M", key='Earliest Date')).size() 

nicht mit:

AttributeError: 'Index' object has no attribute 'to_timestamp' 

nicht sicher, wie ich es sonst zu tun?

+0

was macht dt_parse? Ich vermute, dass 'as_index = False' an df.groupby() übergeben wird, was Sie wollen. – Thtu

+0

dt_parse gibt das Datum als Periode zurück (siehe ersten Link). Beim Aufruf von df.groupby as_index = False hinzugefügt (ohne den Schlüssel arg, da scheint es nicht zu gelten), wird jetzt der gleiche Fehler wie bei einer Serie angezeigt (TypeError: Nur gültig mit DatetimeIndex, TimedeltaIndex oder PeriodIndex, aber eine Instanz von 'Index') – Richard

Antwort

0

Die Fehlermeldungen und Pandas Dokumentation werden Ihre Freunde hier sein.

Ich habe keine Ahnung, ob Ihre Datumsspalte streng eindeutige Daten enthält. Wenn sie es sind, ist es trivial, verwenden Sie es einfach als Index und Sie können pd.Grouper verwenden. Ansonsten definieren Sie Ihre eigene Gruppierungsfunktion:

def grouper(ind): 
    y = df.loc[ind]['Earliest Date'].year 
    return y - (y % 10) 

# I'm assuming that df is the dataframe from pd.read_csv("/path/to/csv") 
# and that there's a column named "earliest date" 
# that is a Period or Datetime or something with a year attribute 
gb = df.groupby(by=grouper) 
print(gb.size()) 
+0

Wunderbar, arbeiten jetzt danke. Ein ziemlich tiefer Tauchgang für ein erstes Projekt, definitiv zurück zu den Docs! – Richard