按日期对熊猫数据框进行排序


98

我有一个熊猫数据框,如下所示:

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

我想按它排序Date,但该列只是一个object

我试图将列设置为日期对象,但是遇到了一种格式不需要的格式的问题。所需的格式为2015-02-20,等。

因此,现在我试图找出如何使numpy将“美国”日期转换为ISO标准,以便可以使它们成为日期对象,以便可以对它们进行排序。

我该如何将这些美国日期转换为ISO标准,或者我在熊猫中缺少更直接的方法?

Answers:


149

您可以pd.to_datetime()用来转换为日期时间对象。它带有一个format参数,但是在您的情况下,我认为您不需要它。

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

1
事实证明,纪元是错误的,因为其假设时间为18:00小时,等等。我需要将其设为00:00小时。如果我可以使日期对象没有时间或错误的时间,我有一种转换为纪元的方法。
nicholas.reichel

pd.to_datetime(df.Date)[0]返回Timestamp('2015-02-20 00:00:00')
JAB

用更正式的问题描述开始新问题
nicholas.reichel

98

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)

3
我建议您将其用于:df.sort_values(by = ['Date'])
FLBKernel

我不停地想知道为什么我的排序中有重复项。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')

根据要求更改日期格式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.