2013-11-21 28 views
5

Ich habe einen Pandas DataFrame, der eine date Spalte enthält. Elemente dieser Spalte sind vom Typ pandas.tslib.Timestamp.Pandas DataFrame nach Datum gruppieren

Ich möchte das Dataframe nach Datum gruppieren, aber Zeitstempelinformationen ausschließen, die dieses Datum detaillierter sind (dh Gruppierung nach Datum, wobei alle Feb 23, 2011 gruppiert sind). Ich weiß, wie ich das in SQL ausdrücken kann, aber für Pandas ziemlich neu.

This question tut etwas sehr ähnlich, aber ich verstehe den Code nicht und es verwendet datetime Objekte.

Von der documentation, ich verstehe nicht einmal, wie Sie das Datum von einem Pandas Timestamp-Objekt abrufen. Ich könnte zu datetime Objekt konvertieren, aber das scheint sehr umständlich.


Wie gefordert, die Ausgabe von df.head():

date show network timed session_id 
0 2011-12-03 02:48:52 Monk TV38 670  00003DA9-01D2-E7A9-4177-203BE6A9E2BA  
1 2011-12-03 03:00:09 WBZ News TV38 205  00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
2 2011-12-03 03:04:04 Dateline NBC NBC  30 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
3 2011-12-03 03:04:35 20/20 ABC  25 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
4 2011-12-03 03:04:56 College Football FOX  55 00003DA9-01D2-E7A9-4177-203BE6A9E2BA 
+1

die Ausgabe von Ihnen df.head() wird hier begrüßt – Boud

Antwort

12

Sie können das normalize DatetimeIndex Methode (die es an diesem Tag bis Mitternacht dauert):

In [11]: df['date'] 
Out[11]: 
0 2011-12-03 02:48:52 
1 2011-12-03 03:00:09 
2 2011-12-03 03:04:04 
3 2011-12-03 03:04:35 
4 2011-12-03 03:04:56 
Name: date, dtype: datetime64[ns] 

In [12]: pd.DatetimeIndex(df['date']).normalize() 
Out[12]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2011-12-03 00:00:00, ..., 2011-12-03 00:00:00] 
Length: 5, Freq: None, Timezone: None 

Und Sie können GROUPBY dies:

g = df.groupby(pd.DatetimeIndex(df['date']).normalize()) 

In 0,15 Sie haben werden Zugriff auf das dt-Attribut, so kann dies wie folgt schreiben:

g = df.groupby(df['date'].dt.normalize()) 
+0

Danke, ich verstehe und das ist genau das, was ich gesucht habe. –

+2

Eine andere Alternative: 'pd.DatetimeIndex (df [" date "]). Date' stattdessen. Ein Vorteil ist, dass viele allgemeine Dinge, die Sie gruppieren möchten, eingebaut sind: '.month',' .year', '.hour' usw. – DSM

+0

Es scheint, dass dieser Ansatz Zeitzonen ignoriert, aber patrickrm101 nicht. –

3

Es ist nicht klar, wenn man (wie in SQL) GROUPBY und Aggregate versuchen oder einen Index mit einem statt einem Zeitstempel Datum erstellen.

Wenn Sie versuchen, GROUPBY und aggregrate, könnten Sie es auf diese Weise tun:

df.groupby(df.set_index('date').index.date).mean() 

Zeitreihe Indizes haben Datumzeit properites wie Tag, Datum, etc., dass die zeitlich Spalte aggregieren, da sie die einzige ist, numerische Spalte.

Wenn Sie versuchen, einen Index mit einem Datumsebene zu erstellen, könnten Sie so etwas wie:

import datetime 
df.set_index(['date', df.date.apply(lambda x: datetime.datetime.date(x))], inplace=True) 
df.index.names = ['timestamp', 'daydate'] 

Diese Ihnen mit dem Zeitstempel und ein Datum einen Multiindex geben. Wenn Sie nicht möchten, dass der Index dauerhaft ist, löschen Sie das Argument inplace =.

+0

Ich meinte groupby und aggregieren. Es scheint, dass Ihre Methode etwas generischer ist als die von Andy Hayden (dh sie arbeitet länger als nur Tage). –