2015-01-27 37 views
20

Tôi có một dataframe gấu trúc như sau:Sắp xếp Pandas Dataframe theo Ngày

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

Tôi muốn sắp xếp nó bằng cách Date, nhưng cột chỉ là một object.

Tôi đã cố gắng đặt cột làm đối tượng ngày, nhưng tôi đã gặp sự cố trong đó định dạng đó không phải là định dạng cần thiết. Các định dạng cần thiết là 2015-02-20, vv

Vì vậy, bây giờ tôi đang cố gắng tìm ra cách chuyển đổi ngày 'Mỹ' thành tiêu chuẩn ISO, để tôi có thể biến chúng thành các đối tượng ngày tháng để tôi có thể sắp xếp theo chúng.

Làm cách nào để chuyển đổi những ngày tháng này thành tiêu chuẩn ISO hoặc có phương pháp tiếp cận thẳng hơn mà tôi thiếu trong gấu trúc?

Trả lời

38

Bạn có thể sử dụng pd.to_datetime() để chuyển đổi thành đối tượng ngày giờ. Nó có một tham số định dạng, nhưng trong trường hợp của bạn tôi không nghĩ rằng bạn cần nó.

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

Đối với tìm kiếm tương lai, bạn có thể thay đổi tuyên bố loại:

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

Tôi cũng có một df ['Date']. Unique() trước khi sắp xếp, trả về một chuỗi thay vì Dataframe. Điều này làm cho 02/20/2015 thành 2015-02-19T18: 00: 00.000000000-0600, sau đó được chia thành 2015-02-19. Có cách nào để thêm một ngày không? Hoặc một cách chính thức hơn để sửa lỗi này? – mobone

+0

'df.Date.astype (np.int64)' nên hoạt động trong thời gian epoch – JAB

+1

Chỉ ra rằng thời đại sẽ sai vì thời gian giả định là 18 giờ, vv .. Tôi cần chúng là 00:00 giờ. Tôi có một cách để chuyển đổi sang epoch nếu tôi chỉ có thể nhận được các đối tượng ngày không có thời gian, hoặc thời gian sai. – mobone

5

@JAB's answer là nhanh và súc tích. Nhưng nó thay đổi các DataFrame bạn đang cố gắng sắp xếp, mà bạn có thể hoặc có thể không muốn.

(Note: Bạn gần như chắc chắn sẽ muốn nó, bởi vì cột ngày của bạn nên được ngày tháng, không dây!)

Trong trường hợp không chắc rằng bạn không muốn thay đổi ngày vào những ngày tháng, bạn cũng có thể làm điều đó theo một cách khác.

Đầu tiên, có chỉ số từ được sắp xếp Date cột của bạn:

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

Sau đó sử dụng nó để chỉ số ban đầu DataFrame của bạn, để lại nó không bị ảnh hưởng:

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 

Magic!

Các vấn đề liên quan