Pandas Veri Çerçevesini Tarihe Göre Sırala


94

Aşağıdaki gibi bir panda veri çerçevem ​​var:

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

Sıralamak istiyorum Dateama sütun sadece bir object.

Sütunu bir tarih nesnesi yapmaya çalıştım, ancak bu formatın gerekli format olmadığı bir sorunla karşılaştım. Gerekli format 2015-02-20,vb.

Şimdi, "Amerikan" tarihlerini ISO standardına nasıl çevireceğimi bulmaya çalışıyorum, böylece onları tarih nesnelerine göre sıralayabileyim.

Bu Amerikan tarihlerini ISO standardına nasıl dönüştürebilirim yoksa pandalarda kaçırdığım daha basit bir yöntem var mı?

Yanıtlar:


142

pd.to_datetime()Bir datetime nesnesine dönüştürmek için kullanabilirsiniz . Bir format parametresi alıyor, ama senin durumunda ihtiyacın olduğunu sanmıyorum.

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

İleride arama yapmak için sort ifadesini değiştirebilirsiniz:

>>> 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
Ayrıca, sıralamadan önce Dataframe yerine bir dizi döndüren bir df ['Tarih']. Unique () var. Bu, 02/20 / 2015'i 2015-02-19T18: 00: 00.000000000-0600'e getirir ve ardından 2015-02-19'a bölünür. Gün eklemenin bir yolu var mı? Ya da bunu düzeltmenin daha resmi bir yolu?
nicholas.reichel

1
df.Date.astype(np.int64)çağ zamanı için çalışmalı
JAB

1
Dönemin 18:00 saat vb. Varsayımları nedeniyle yanlış olacağı ortaya çıktı. 00:00 saat olmasına ihtiyacım var. Sadece tarih nesnelerinin bir zamanı olmamasını ya da yanlış zamana sahip olsaydım epoch'a dönüştürebileceğim bir yol var.
nicholas.reichel

benim için pd.to_datetime(df.Date)[0]dönerTimestamp('2015-02-20 00:00:00')
JAB

Sorunun daha resmi bir açıklamasıyla yeni soruya başlamak
nicholas.reichel

90

sortyöntem kullanımdan kaldırıldı ve ile değiştirildi sort_values. Kullanarak datetime nesnesine dönüştürdükten sonradf['Date']=pd.to_datetime(df['Date'])

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

Not: yerinde ve / veya azalan düzende sıralamak için (en yenisi ilk sırada):

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

2
Bunu şu şekilde kullanmanızı öneririm: df.sort_values ​​(by = ['Date'])
FLBKernel

11

@ JAB'ın cevabı hızlı ve özlü. Ancak, DataFrameisteyip istemediğiniz, sıralamaya çalıştığınız şeyi değiştirir .

( Not : Neredeyse kesinlikle olacak tarih sütunları tarihleri değil dizeleri olmalıdır çünkü, bunu istiyorum!)

Tarihleri ​​tarihlere dönüştürmek istemediğiniz beklenmedik bir durumda, bunu farklı bir şekilde de yapabilirsiniz.

İlk olarak, dizini sıralanmış Datesütununuzdan alın:

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

Ardından orijinalinizi dizine eklemek için kullanın DataFrameve el değmeden bırakın:

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

Büyü!

Not: Pandalar'ın 0.20.0 ve sonraki sürümleri için , artık kullanımdan kaldırılan locyerine kullanın ix.


0

Tarih sütununu içeren veriler aşağıdaki kod kullanılarak okunabilir:

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

Veriler, yukarıdaki kod satırı kullanılarak okunduktan sonra, tarihle ilgili bilgileri içeren sütuna aşağıdaki gibi erişilebilir pd.date_time():

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

tarih formatını ihtiyaca göre değiştirmek için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.