2017-08-08 2 views
2

First off, ist mein Datensatz unterProbleme mit Gruppierung Pandas Datenrahmen von Stunde

here

gezeigt. Ich habe verwandte Fragen zu here gefunden, aber aus irgendeinem Grund scheint die Lösung nicht zu funktionieren. Ich habe meine Versuche unten aufgeführt.

Ich begann mit dieser ab:

df["dropoff_datetime"] = pd.to_datetime(df["dropoff_datetime"]) 
df["pickup_datetime"] = pd.to_datetime(df["pickup_datetime"]) 

test = df.groupby(df.hour).sum() 

Und ich habe den folgenden Fehler:

AttributeError: 'DataFrame' object has no attribute 'hour' 

Dann habe ich versucht, dies:

test = df.groupby(df.dropoff_datetime.hour).sum() 

Und ich bekam die folgenden Fehler :

AttributeError: 'Series' object has no attribute 'hour' 

Ich bin ein wenig verwirrt, weil es scheint, dass meine Situation die gleiche ist wie die oben verlinkte Frage. Ich bin mir nicht sicher, warum ich Fehler bekomme. Jede mögliche Hilfe würde viel

Antwort

3

geschätzt werden wir Series.dt.hour Accessor verwenden können:

test = df.groupby(df['pickup_datetime'].dt.hour).sum() 

Hier ist ein Beispiel beschreibt den Unterschied:

In [136]: times = pd.to_datetime(['2017-08-01 13:13:13', '2017-08-01 20:20:20']) 

In [137]: times 
Out[137]: DatetimeIndex(['2017-08-01 13:13:13', '2017-08-01 20:20:20'], dtype='datetime64[ns]', freq=None) 

In [138]: type(times) 
Out[138]: pandas.core.indexes.datetimes.DatetimeIndex 

In [139]: times.hour 
Out[139]: Int64Index([13, 20], dtype='int64') 

wie oben DatetimeIndex gezeigt hat "direkte" .hour Accessor, aber Series von datetime dtype hat .dt.hour accessor:

In [140]: df = pd.DataFrame({'Date': times}) 

In [141]: df 
Out[141]: 
       Date 
0 2017-08-01 13:13:13 
1 2017-08-01 20:20:20 

In [142]: type(df.Date) 
Out[142]: pandas.core.series.Series 

In [143]: df['Date'].dt.hour 
Out[143]: 
0 13 
1 20 
Name: Date, dtype: int64 

Wenn wir Date Spalte als Index gesetzt:

In [146]: df.index = df['Date'] 

In [147]: df 
Out[147]: 
            Date 
Date 
2017-08-01 13:13:13 2017-08-01 13:13:13 
2017-08-01 20:20:20 2017-08-01 20:20:20 

es wird:

In [149]: type(df.index) 
Out[149]: pandas.core.indexes.datetimes.DatetimeIndex 

so können wir es direkt zugreifen (ohne .dt Accessor) wieder:

In [148]: df.index.hour 
Out[148]: Int64Index([13, 20], dtype='int64', name='Date') 
+0

Das ist perfekt, danke! – madsthaks

1

Need .dt weil mit Series -arbeiten:

test = df.groupby(df.dropoff_datetime.dt.hour).sum() 

Aber wenn DatetimeIndex, weglassen - DatetimeIndex.hour:

test = df.groupby(df.index.hour).sum() 
Verwandte Themen