Sắp xếp khung dữ liệu gấu trúc theo ngày


94

Tôi có một khung dữ liệu gấu trúc như sau:

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

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

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

Vì vậy, bây giờ tôi đang cố gắng tìm ra cách để numpy chuyển đổi ngày tháng 'kiểu Mỹ' thành tiêu chuẩn ISO, để tôi có thể tạo cho chúng 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 ở Mỹ này thành tiêu chuẩn ISO, hoặc có một phương pháp chuyển tiếp thẳng nào hơn mà tôi đang thiếu đối với gấu trúc?

Câu trả lời:


142

Bạn có thể sử dụng pd.to_datetime()để chuyển đổi sang đối tượng datetime. Nó có một tham số định dạng, nhưng trong trường hợp của bạn, tôi nghĩ bạn không 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

Để tìm kiếm trong tương lai, bạn có thể thay đổi câu lệnh sắp xếp:

>>> 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
Tôi cũng có df ['Date']. Unique () trước khi sắp xếp, trả về một chuỗi thay vì Khung dữ liệu. Điều này làm cho 02/20/2015 thành 2015-02-19T18: 00: 00.000000000-0600, sau đó được tách 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 chữa điều này?
nicholas.reichel

1
df.Date.astype(np.int64)nên làm việc cho thời gian kỷ nguyên
JAB

1
Hóa ra rằng kỷ nguyên sẽ sai vì thời gian giả định của nó là 18:00 giờ, v.v. Tôi cần chúng là 00:00 giờ. Tôi có một cách để chuyển đổi sang kỷ nguyên nếu tôi chỉ có thể lấy các đối tượng ngày tháng để không có thời gian hoặc sai thời gian.
nicholas.reichel,

cho tôi pd.to_datetime(df.Date)[0]trở lạiTimestamp('2015-02-20 00:00:00')
JAB

Bắt đầu từ câu hỏi mới với mô tả chính thức hơn về vấn đề này
nicholas.reichel

90

sortphương thức đã không được chấp nhận và được thay thế bằng sort_values. Sau khi chuyển đổi sang đối tượng datetime bằng cách sử dụngdf['Date']=pd.to_datetime(df['Date'])

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

Lưu ý: để sắp xếp tại chỗ và / hoặc theo thứ tự giảm dần (gần đây nhất trước):

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

2
Tôi sẽ đề nghị bạn sử dụng nó với: df.sort_values ​​(by = ['Date'])
FLBKernel

11

Câu trả lời của @ JAB rất nhanh và ngắn gọn. Nhưng nó thay đổi những DataFramegì bạn đang cố gắng sắp xếp mà bạn có thể muốn hoặc có thể không muốn.

( Lưu ý : Bạn gần như chắc chắn sẽ muốn nó, bởi vì cột ngày của bạn phải là ngày tháng, không phải chuỗi!)

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

Đầu tiên, lấy chỉ mục từ Datecột đã sắp xếp 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ó để lập chỉ mục bản gốc của bạn DataFrame, để nguyê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

Ma thuật!

Lưu ý: đối với phiên bản Pandas 0.20.0 trở lên, hãy sử dụng locthay thế cho phiên bản ixhiện không được dùng nữa.


0

Dữ liệu chứa cột ngày có thể được đọc bằng cách sử dụng mã dưới đây:

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

Khi dữ liệu được đọc bằng cách sử dụng dòng mã trên, cột chứa thông tin về ngày tháng có thể được truy cập bằng cách sử dụng pd.date_time()như:

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

để thay đổi định dạng ngày theo yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.