Sortieren Sie den Pandas-Datenrahmen nach Datum

94

Ich habe einen Pandas-Datenrahmen wie folgt:

Symbol  Date
A       02/20/2015
A       01/15/2016
A       08/21/2015

Ich möchte es sortieren Date, aber die Spalte ist nur eine object.

Ich habe versucht, die Spalte zu einem Datumsobjekt zu machen, bin jedoch auf ein Problem gestoßen, bei dem dieses Format nicht das erforderliche Format ist. Das benötigte Format ist 2015-02-20,etc.

Jetzt versuche ich herauszufinden, wie numpy die 'amerikanischen' Daten in den ISO-Standard konvertieren kann, damit ich sie zu Datumsobjekten machen und nach ihnen sortieren kann.

Wie würde ich diese amerikanischen Daten in ISO-Standards umwandeln, oder gibt es eine einfachere Methode, die mir bei Pandas fehlt?

nicholas.reichel
quelle

Antworten:

142

Sie können verwenden pd.to_datetime(), um in ein Datum / Uhrzeit-Objekt zu konvertieren. Es braucht einen Formatparameter, aber in Ihrem Fall glaube ich nicht, dass Sie ihn brauchen.

>>> import pandas as pd
>>> df = pd.DataFrame( {'Symbol':['A','A','A'] ,
    'Date':['02/20/2015','01/15/2016','08/21/2015']})
>>> df
         Date Symbol
0  02/20/2015      A
1  01/15/2016      A
2  08/21/2015      A
>>> df['Date'] =pd.to_datetime(df.Date)
>>> df.sort('Date') # This now sorts in date order
        Date Symbol
0 2015-02-20      A
2 2015-08-21      A
1 2016-01-15      A

Für die zukünftige Suche können Sie die Sortieranweisung ändern:

>>> df.sort_values(by='Date') # This now sorts in date order
        Date Symbol
0 2015-02-20      A
2 2015-08-21      A
1 2016-01-15      A
JAB
quelle
1
Ich habe auch ein df ['Date']. Unique () vor der Sortierung, das eine Reihe anstelle eines Datenrahmens zurückgibt. Dies macht 20.02.2015 in 2015-02-19T18: 00: 00.000000000-0600, die dann in 2015-02-19 aufgeteilt wird. Gibt es eine Möglichkeit, einen Tag hinzuzufügen? Oder eine formellere Möglichkeit, dies zu korrigieren?
nicholas.reichel
1
df.Date.astype(np.int64)sollte für die Epochenzeit funktionieren
JAB
1
Es stellt sich heraus, dass die Epoche falsch wäre, da sie Zeiten von 18:00 Uhr usw. annimmt. Ich brauche sie, um 00:00 Uhr zu sein. Ich habe eine Möglichkeit, in eine Epoche zu konvertieren, wenn ich nur die Datumsobjekte dazu bringen könnte, keine Zeit oder die falsche Zeit zu haben.
nicholas.reichel
für mich pd.to_datetime(df.Date)[0]kehrt zurückTimestamp('2015-02-20 00:00:00')
JAB
Neue Frage mit formellerer Beschreibung des Problems beginnen
nicholas.reichel
90

sortMethode wurde veraltet und ersetzt durch sort_values. Nach der Konvertierung in datetime Objekt mitdf['Date']=pd.to_datetime(df['Date'])

df.sort_values(by=['Date'])

Hinweis: Zum Sortieren an Ort und Stelle und / oder in absteigender Reihenfolge (die letzte zuerst):

df.sort_values(by=['Date'], inplace=True, ascending=False)
Wecken
quelle
2
Ich würde vorschlagen, dass Sie es verwenden mit: df.sort_values ​​(by = ['Date'])
FLBKernel
11

Die Antwort von @ JAB ist schnell und präzise. Aber es ändert das DataFrame, was Sie sortieren möchten, was Sie vielleicht wollen oder nicht.

( Hinweis : Sie mit ziemlicher Sicherheit wird es wollen, weil Ihre Datumsspalten Daten sein sollte, keine Strings!)

In dem unwahrscheinlichen Fall, dass Sie die Daten nicht in Daten ändern möchten, können Sie dies auch auf andere Weise tun.

Holen Sie sich zuerst den Index aus Ihrer sortierten DateSpalte:

In [25]: pd.to_datetime(df.Date).order().index
Out[25]: Int64Index([0, 2, 1], dtype='int64')

Verwenden Sie es dann, um Ihr Original zu indizieren DataFrameund es unberührt zu lassen:

In [26]: df.ix[pd.to_datetime(df.Date).order().index]
Out[26]: 
        Date Symbol
0 2015-02-20      A
2 2015-08-21      A
1 2016-01-15      A

Magie!

Hinweis: Verwenden Sie für Pandas-Versionen 0.20.0 und höher locanstelle von ix, was jetzt veraltet ist.

LondonRob
quelle
0

Die Daten, die die Datumsspalte enthalten, können mit dem folgenden Code gelesen werden:

data = pd.csv(file_path,parse_dates=[date_column])

Sobald die Daten mithilfe der obigen Codezeile gelesen wurden, kann auf die Spalte mit den Informationen zum Datum pd.date_time()wie folgt zugegriffen werden :

pd.date_time(data[date_column], format = '%d/%m/%y')

um das Format des Datums gemäß der Anforderung zu ändern.

Manthra
quelle