2016-09-08 4 views
2

ich einige Datenrahmen haben, die wie folgt aussieht:Pandas group_by Datum und sampeln

A B C date 
0 J Y 2 2013-02-01 14:21:02.070030 
1 X X 0 2013-02-01 15:49:33.110849 
2 Y D 9 2013-02-01 06:47:19.369514 
3 Y C 17 2013-02-01 08:56:11.751781 
4 3 J 21 2013-02-01 14:19:12.017232 

Ich möchte nach dem Datum zu gruppieren und dann zählen, aber die Information über die Stunden, Minuten, Sekunden, etc. weglassen .

Es scheint so etwas wie dies funktioniert:

df.set_index('date').resample('D').count() 

Zwei Fragen:

  1. Warum funktioniert das? Ist das der richtige Weg?
  2. Warum funktioniert so etwas wie df.group_by('date').resample('D').count() nicht?
+0

1. Weil 'resample' mit Zeitindizes arbeitet. Und ja, das ist der richtige Weg. 2. Etwas wie 'df.group_by ('date'). Resample ('D'). Count()' würde nicht funktionieren, weil Sie eine Zeitindexierung benötigen, damit das Sampling funktioniert. Sie können etwas tun wie: 'df.set_index ('date') .resample ('D'). Count(). Reset_index()' um 'date' als Spalte beizubehalten. – Abdou

Antwort

4

resample in gewissem Sinne ist nur ein Spezialfall von groupby - und nicht auf unterschiedliche Werte Gruppierung, die was grouppy('date') ist täte, es Gruppen, die eine zeitbasierte Transformation des Index, weshalb Sie setzen müssen, ist, Der Index. Alternativ können Sie tun:

df.groupby(pd.Grouper(key='date', freq='D')).count() 

In der kommenden Version 0.19.0 Sie in der Lage sein werden, die oben so zu schreiben.

df.resample('D', on='date').count() 
+0

Als ich Ihren Vorschlag von pd.Grouper versuchte, bekam ich den folgenden Fehler: TypeError: Nur gültig mit DatetimeIndex, TimedeltaIndex oder PeriodIndex, aber bekam eine Instanz von 'Index' – Huey

+0

@Huey Sie müssen sicherstellen, dass Ihre Datumsspalte eine 'Datum_Zeit ist 'Spalte. Es ist vernünftig für uns anzunehmen, dass es ist, da es ein Datum ist. Führen Sie die Konvertierung mit 'df.date = pd.to_datetime (df.date)' durch und wenden Sie dann die Antwort von chrisb an. Dann überprüfe das als die gewählte Antwort, weil es eine gute Antwort ist ;-) – piRSquared

+0

Ich habe pd.to_datetime benutzt und ich konnte das nicht zur Arbeit bringen. – Huey