Urutkan Pandas Dataframe berdasarkan Tanggal

94

Saya memiliki kerangka data panda sebagai berikut:

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

Saya ingin mengurutkannya Date, tetapi kolomnya hanya object.

Saya mencoba membuat kolom menjadi objek tanggal, tetapi saya mengalami masalah di mana format itu bukan format yang diperlukan. Format yang dibutuhkan adalah 2015-02-20,dll.

Jadi sekarang saya mencoba untuk mencari cara agar numpy mengubah tanggal 'Amerika' ke dalam standar ISO, sehingga saya bisa menjadikannya objek tanggal, sehingga saya bisa mengurutkan berdasarkan tanggal tersebut.

Bagaimana cara mengubah tanggal amerika ini menjadi standar ISO, atau adakah metode yang lebih langsung yang saya lewatkan dalam panda?

nicholas.reichel
sumber

Jawaban:

142

Anda dapat menggunakan pd.to_datetime()untuk mengonversi ke objek datetime. Dibutuhkan parameter format, tetapi dalam kasus Anda, saya rasa Anda tidak membutuhkannya.

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

Untuk pencarian selanjutnya, Anda dapat mengubah pernyataan sortir:

>>> 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
TUSUKAN
sumber
1
Saya juga memiliki df ['Date']. Unique () sebelum sort, yang mengembalikan seri, bukan Dataframe. Ini membuat 02/20/2015 menjadi 2015-02-19T18: 00: 00.000000000-0600 yang kemudian dibagi menjadi 2015-02-19. Apakah ada cara untuk menambahkan hari? Atau cara yang lebih formal untuk memperbaikinya?
nicholas.reichel
1
df.Date.astype(np.int64)harus bekerja untuk waktu
kurun
1
Ternyata waktu itu akan salah karena waktu asumsi jam 18:00, dll. Saya membutuhkannya menjadi jam 00:00. Saya memiliki cara untuk mengonversi ke zaman jika saya bisa mendapatkan objek tanggal untuk tidak punya waktu, atau waktu yang salah.
nicholas.reichel
bagi saya pd.to_datetime(df.Date)[0]kembaliTimestamp('2015-02-20 00:00:00')
JAB
Memulai pertanyaan baru dengan deskripsi masalah yang lebih formal
nicholas.reichel
90

sortmetode sudah tidak digunakan lagi dan diganti dengan sort_values. Setelah mengonversi ke objek datetime menggunakandf['Date']=pd.to_datetime(df['Date'])

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

Catatan: untuk mengurutkan di tempat dan / atau dalam urutan menurun (yang terbaru lebih dulu):

df.sort_values(by=['Date'], inplace=True, ascending=False)
Bangun pagi
sumber
2
Saya menyarankan Anda untuk menggunakannya dengan: df.sort_values ​​(by = ['Date'])
FLBKernel
11

Jawaban @ JAB cepat dan ringkas. Tapi itu mengubah DataFrameAnda mencoba mengurutkan, yang mungkin Anda inginkan atau tidak inginkan.

( Catatan : Anda hampir pasti akan menginginkannya, karena kolom tanggal Anda harus tanggal, tidak string!)

Jika Anda tidak ingin mengubah tanggal menjadi tanggal, jika Anda tidak ingin mengubah tanggal menjadi tanggal, Anda juga dapat melakukannya dengan cara yang berbeda.

Pertama, dapatkan indeks dari Datekolom yang Anda sortir:

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

Kemudian gunakan untuk mengindeks dokumen asli Anda DataFrame, biarkan tidak tersentuh:

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

Sihir!

Catatan: untuk Pandas versi 0.20.0 dan yang lebih baru, gunakan locsebagai pengganti ix, yang sekarang sudah tidak digunakan lagi.

LondonRob
sumber
0

Data yang berisi kolom tanggal dapat dibaca dengan menggunakan kode di bawah ini:

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

Setelah data dibaca dengan menggunakan baris kode di atas, kolom yang berisi informasi tentang tanggal dapat diakses dengan menggunakan pd.date_time()seperti:

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

untuk mengubah format tanggal sesuai kebutuhan.

Manthra
sumber