Sortuj ramkę danych Pandas według daty

93

Mam następującą ramkę danych pandy:

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

Chcę to posortować według Date, ale kolumna to tylko plik object.

Próbowałem ustawić kolumnę jako obiekt daty, ale napotkałem problem, w którym ten format nie jest wymagany. Potrzebny format to 2015-02-20,itp.

Więc teraz próbuję wymyślić, w jaki sposób numpy przekonwertować daty „amerykańskie” na standard ISO, aby móc uczynić z nich obiekty daty, aby móc sortować według nich.

Jak przekonwertować te amerykańskie daty na standard ISO, czy jest bardziej prosta metoda, której brakuje mi w pandach?

nicholas.reichel
źródło

Odpowiedzi:

142

Możesz użyć pd.to_datetime()do konwersji na obiekt daty i godziny. Pobiera parametr formatu, ale wydaje mi się, że w twoim przypadku go nie potrzebujesz.

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

Przy wyszukiwaniu w przyszłości możesz zmienić instrukcję sortowania:

>>> 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
UKŁUCIE
źródło
1
Mam również df ['Date']. Unique () przed sortowaniem, które zwraca serię zamiast Dataframe. To sprawia, że ​​02/20/2015 zmieni się w 2015-02-19T18: 00: 00.000000000-0600, który następnie zostanie podzielony na 2015-02-19. Czy jest sposób, aby dodać dzień? Albo bardziej formalny sposób, aby to naprawić?
nicholas.reichel
1
df.Date.astype(np.int64)powinno działać dla epoki
JAB
1
Okazuje się, że ta epoka byłaby zła, ponieważ przyjmuje godziny 18:00 itd. Potrzebuję, aby były to godziny 00:00. Mam sposób na przekonwertowanie na epokę, gdybym tylko mógł sprawić, by obiekty daty nie miały czasu lub niewłaściwego czasu.
nicholas.reichel
dla mnie pd.to_datetime(df.Date)[0]wracaTimestamp('2015-02-20 00:00:00')
JAB
Rozpoczęcie nowego pytania od bardziej formalnego opisu problemu
nicholas.reichel
90

sortmetoda została wycofana i zastąpiona przez sort_values. Po konwersji do obiektu datetime przy użyciudf['Date']=pd.to_datetime(df['Date'])

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

Uwaga: aby posortować na miejscu i / lub w porządku malejącym (od najnowszych):

df.sort_values(by=['Date'], inplace=True, ascending=False)
Pobudka
źródło
2
Sugerowałbym użycie go z: df.sort_values ​​(by = ['Date'])
FLBKernel
11

Odpowiedź @ JAB jest szybka i zwięzła. Ale zmienia to, DataFrameco próbujesz posortować, co możesz chcieć lub nie.

( Uwaga : prawie na pewno będziesz tego chciał, ponieważ kolumny z datami powinny być datami, a nie ciągami!)

W mało prawdopodobnym przypadku, gdy nie chcesz zmieniać dat na daty, możesz to również zrobić w inny sposób.

Najpierw pobierz indeks z posortowanej Datekolumny:

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

Następnie użyj go do zindeksowania oryginału DataFrame, pozostawiając go nietkniętym:

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

Magia!

Uwaga: w przypadku Pand w wersji 0.20.0 i nowszych użyj loczamiast ix, które jest teraz przestarzałe.

LondonRob
źródło
0

Dane zawierające kolumnę daty można odczytać korzystając z poniższego kodu:

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

Po odczytaniu danych za pomocą powyższego wiersza kodu, do kolumny zawierającej informacje o dacie można uzyskać dostęp za pomocą pd.date_time():

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

zmienić format daty zgodnie z wymaganiami.

Mantra
źródło