webdevqa.jp.net

Pandasデータフレームを日付で並べ替え

次のようなpandasデータフレームがあります。

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

Dateでソートしたいのですが、列はobjectです。

列を日付オブジェクトにしようとしましたが、その形式が必要な形式ではないという問題に遭遇しました。必要な形式は2015-02-20,などです。

だから今、私はnumpyに「アメリカ」の日付をISO標準に変換して、日付オブジェクトを作成してソートできるようにする方法を見つけようとしています。

これらのアメリカの日付をどのようにISO標準に変換しますか、またはパンダ内で欠落しているより簡単な方法がありますか?

45

pd.to_datetime()を使用して、日時オブジェクトに変換できます。それはフォーマットパラメータを取りますが、あなたの場合、私はあなたがそれを必要とは思わない。

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

将来の検索のために、ソートステートメントを変更できます。

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

sortメソッドは、DataFrameで 非推奨 になりました。現在は sort_values です。 df['Date']=pd.to_datetime(df['Date'])を使用してdatetimeオブジェクトに変換した後、

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

注:in-placeおよび/または降順(逆時系列)にソートするには:

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

@ JABの答え は高速で簡潔です。ただし、ソートしようとしているDataFrameは変更されますが、これは必要な場合とそうでない場合があります。

:ほぼ確実にが必要になります日付列は文字列ではなく日付である必要があるためです!)

万が一、日付を日付に変更したくない場合は、別の方法で変更することもできます。

まず、ソートされたDate列からインデックスを取得します。

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

次に、それを使用して元のDataFrameのインデックスを作成し、そのままにします。

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

魔法!

注: Pandasバージョン0.20.0以降では、廃止予定のlocの代わりに ix を使用します。

9
LondonRob