パンダのデータフレームを日付で並べ替える


98

私は次のようにパンダのデータフレームを持っています:

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

で並べ替えたいのですDateが、列はただのobjectです。

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

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

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

回答:


148

を使用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

今後の検索のために、sortステートメントを変更できます。

>>> 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
また、並べ替えの前にdf ['Date']。unique()があり、データフレームの代わりにシリーズを返します。これにより、2015年2月20日が2015-02-19T18:00:00.000000000-0600になり、2015-02-19に分割されます。日を追加する方法はありますか?または、これを修正するためのより正式な方法はありますか?
nicholas.reichel 2015年

1
df.Date.astype(np.int64)エポックタイムで動作するはず
JAB 2015年

1
18:00などを想定しているので、エポックが間違っていることがわかります。00:00時間にする必要があります。日付オブジェクトに時刻がない、または時刻が間違っている可能性がある場合は、エポックに変換する方法があります。
nicholas.reichel 2015年

私にとってpd.to_datetime(df.Date)[0]は戻ってきますTimestamp('2015-02-20 00:00:00')
JAB 2015年

問題のより正式な説明から新しい質問を開始
nicholas.reichel 2015年

98

sortメソッドは非推奨になり、に置き換えられましたsort_values。を使用して日時オブジェクトに変換した後df['Date']=pd.to_datetime(df['Date'])

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

注:インプレースおよび/または降順(最新のものから)で並べ替えるに

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

3
df.sort_values(by = ['Date'])
FLBKernel 2018

ソートに重複があるのはなぜだろうと頭を悩ませていました。inplace = Trueはそれを修正しました。本当にありがとう!
デイブデイビス

11

@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使用してください。これは現在非推奨です。


0

日付列を含むデータは、以下のコードを使用して読み取ることができます。

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

上記のコード行を使用してデータを読み取ると、日付に関する情報を含む列に次のようにアクセスできますpd.date_time()

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

要件に応じて日付の形式を変更します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.