Trier la trame de données Pandas par date


94

J'ai un dataframe pandas comme suit:

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

Je veux le trier par Date, mais la colonne est juste un object.

J'ai essayé de faire de la colonne un objet de date, mais j'ai rencontré un problème où ce format n'est pas le format nécessaire. Le format nécessaire est 2015-02-20,etc.

Alors maintenant, j'essaie de comprendre comment convertir numpy les dates «américaines» en norme ISO, afin que je puisse en faire des objets de date, afin que je puisse trier par eux.

Comment convertir ces dates américaines en norme ISO, ou y a-t-il une méthode plus simple qui me manque dans les pandas?

Réponses:


142

Vous pouvez utiliser pd.to_datetime()pour convertir en un objet datetime. Cela prend un paramètre de format, mais dans votre cas, je ne pense pas que vous en ayez besoin.

>>> 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

Pour une recherche future, vous pouvez modifier l'instruction de tri:

>>> 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

1
J'ai aussi un df ['Date']. Unique () avant le tri, qui renvoie une série au lieu d'un Dataframe. Cela fait du 20/02/2015 en 2015-02-19T18: 00: 00.000000000-0600 qui est ensuite scindé en 2015-02-19. Existe-t-il un moyen d'ajouter un jour? Ou une manière plus formelle de corriger cela?
nicholas.reichel

1
df.Date.astype(np.int64)devrait fonctionner pour l'époque
JAB

1
Il s'avère que cette époque serait fausse car ses heures supposées sont de 18h00, etc. J'ai besoin qu'elles soient à 00h00. J'ai un moyen de convertir à l'époque si je pouvais simplement obtenir les objets de date pour ne pas avoir une heure, ou une heure incorrecte.
nicholas.reichel

pour moi pd.to_datetime(df.Date)[0]revientTimestamp('2015-02-20 00:00:00')
JAB

Commencer une nouvelle question avec une description plus formelle du problème
nicholas.reichel

90

sortLa méthode est obsolète et remplacée par sort_values. Après la conversion en objet datetime à l'aide dedf['Date']=pd.to_datetime(df['Date'])

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

Remarque: pour trier sur place et / ou dans un ordre décroissant (le plus récent en premier):

df.sort_values(by=['Date'], inplace=True, ascending=False)

2
Je vous suggère de l'utiliser avec: df.sort_values ​​(by = ['Date'])
FLBKernel

11

La réponse de @ JAB est rapide et concise. Mais cela change le que DataFramevous essayez de trier, ce que vous voudrez peut-être ou non.

( Remarque : vous le voudrez certainement , car vos colonnes de date doivent être des dates, pas des chaînes!)

Dans le cas peu probable où vous ne voudriez pas changer les dates en dates, vous pouvez également le faire d'une manière différente.

Tout d'abord, récupérez l'index de votre Datecolonne triée :

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

Ensuite, utilisez-le pour indexer votre original DataFrame, en le laissant intact:

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

La magie!

Remarque: pour les versions 0.20.0 et supérieures de Pandas, utilisez locplutôt que ix, qui est désormais obsolète.


0

Les données contenant la colonne de date peuvent être lues en utilisant le code ci-dessous:

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

Une fois les données lues en utilisant la ligne de code ci-dessus, la colonne contenant les informations sur la date peut être consultée en utilisant pd.date_time()comme:

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

pour changer le format de la date selon l'exigence.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.