จัดเรียง Pandas Dataframe ตามวันที่


94

ฉันมีดาต้าเฟรมของแพนด้าดังนี้:

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

ฉันต้องการจัดเรียงตามDateแต่คอลัมน์เป็นเพียงobjectไฟล์.

ฉันพยายามทำให้คอลัมน์เป็นวัตถุวันที่ แต่พบปัญหาที่รูปแบบนั้นไม่ใช่รูปแบบที่ต้องการ รูปแบบที่ต้องการ2015-02-20,เป็นต้น

ตอนนี้ฉันกำลังพยายามหาวิธีทำให้ numpy แปลงวันที่ 'American' เป็นมาตรฐาน ISO เพื่อที่ฉันจะได้สร้างเป็นวันที่เป็นวัตถุเพื่อที่ฉันจะได้เรียงลำดับตามพวกมัน

ฉันจะแปลงวันที่อเมริกันเหล่านี้เป็นมาตรฐาน ISO ได้อย่างไรหรือมีวิธีการที่ตรงไปตรงมามากกว่านี้ที่ฉันพลาดไปในแพนด้า

คำตอบ:


142

คุณสามารถใช้pd.to_datetime()เพื่อแปลงเป็นอ็อบเจ็กต์ 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 () ก่อนการจัดเรียงซึ่งส่งคืนชุดข้อมูลแทน Dataframe ทำให้ 02/20/2015 เป็น 2015-02-19T18: 00: 00.000000000-0600 ซึ่งจะแยกเป็น 2015-02-19 มีวิธีเพิ่มวันหรือไม่? หรือวิธีที่เป็นทางการมากขึ้นในการแก้ไขนี้?
nicholas.reichel

1
df.Date.astype(np.int64)ควรทำงานในช่วงเวลา
JAB

1
ปรากฎว่ายุคนั้นจะผิดตั้งแต่เวลาที่สมมติว่า 18:00 น. เป็นต้นไปฉันต้องการให้เป็น 00:00 ชั่วโมง ฉันมีวิธีแปลงเป็น epoch หากฉันสามารถทำให้วัตถุวันที่ไม่มีเวลาหรือผิดเวลาได้
nicholas.reichel

สำหรับฉันpd.to_datetime(df.Date)[0]กลับมาTimestamp('2015-02-20 00:00:00')
JAB

เริ่มคำถามใหม่พร้อมคำอธิบายปัญหาที่เป็นทางการมากขึ้น
nicholas.reichel

90

sortวิธีการได้รับการเลิกsort_valuesและแทนที่ด้วย หลังจากแปลงเป็นวัตถุ datetime โดยใช้df['Date']=pd.to_datetime(df['Date'])

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

หมายเหตุ: ในการเรียงลำดับในตำแหน่งและ / หรือจากมากไปหาน้อย (ลำดับแรกสุด):

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

2
ฉันขอแนะนำให้คุณใช้กับ: df.sort_values ​​(by = ['Date'])
FLBKernel

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.