2017-04-12 70 views
1
symb    dates 
4  BLK 01/03/2014 09:00:00 
0  BBR 02/06/2014 09:00:00 
21  HZ 02/06/2014 09:00:00 
24 OMNI 02/07/2014 09:00:00 
31 NOTE 03/04/2014 09:00:00 
65 AMP 03/04/2016 09:00:00 
40 RBY 04/07/2014 09:00:00 

下面是(df.sort('date'))的输出示例。如何按英文日期格式排序不是美国大熊猫.sort()

正如你可以看到它使用几个月的日子,反之亦然。任何想法如何解决这个问题?

回答

2

您可以使用pandas.to_datetime并使用format参数然后对其进行排序。

>> df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y %H:%M:%S') 
>> df.sort('date') 

       date symb 
0 2014-01-03 09:00:00 BLK 
1 2014-02-06 09:00:00 BBR 
2 2014-02-06 09:00:00 HZ 
3 2014-02-07 09:00:00 OMNI 
4 2014-03-04 09:00:00 NOTE 
6 2014-04-07 09:00:00 RBY 
5 2016-03-04 09:00:00 AMP 
+1

请注意 - 在'的.sort()'方法已过时,使用' .sort_values()'代替 – MaxU

+0

@MaxU好点,看到警告,但由于OP使用.sort(),所以不会引起混淆。 – umutto

0

我不知道你是如何得到的数据,但如果你是从一些源将其导入,如CSV,你可以使用pandas.read_csv并设置parse_dates=True。问题是什么是日期列的类型?你可以使用`dateutil.parse.parse轻松地将它们改为类似日期的对象。例如,

import pandas 
import dateutil 
data = {'symb': ['BLK', 'BBR', 'HZ', 'OMNI', 'NOTE', 'AMP', 'RBY'], 
     'dates': ['01/03/2014 09:00:00', '02/06/2014 09:00:00', '02/06/2014 09:00:00', 
       '02/07/2014 09:00:00', '03/04/2014 09:00:00', '03/04/2016 09:00:00', 
       '04/07/2014 09:00:00']} 
df = pandas.DataFrame.from_dict(data) 
df.dates = df.dates.apply(dateutil.parser.parse) 
print df.to_string() 

# OUTPUT 
# 0 2014-01-03 09:00:00 BLK 
# 1 2014-02-06 09:00:00 BBR 
# 2 2014-02-06 09:00:00 HZ 
# 3 2014-02-07 09:00:00 OMNI 
# 4 2014-03-04 09:00:00 NOTE 
# 5 2016-03-04 09:00:00 AMP 
# 6 2014-04-07 09:00:00 RBY 

这可以让你的[ISO8601格式]这可能是最好的dd/mm/yyyy格式,但如果你必须有这种格式,你可以使用@umutto

推荐代码
0

您可以使用to_datetime,用于分拣sort_values

#format mm/dd/YYYY 
df['dates'] = pd.to_datetime(df['dates']) 
print (df.sort_values('dates')) 
    symb    dates 
4 BLK 2014-01-03 09:00:00 
0 BBR 2014-02-06 09:00:00 
21 HZ 2014-02-06 09:00:00 
24 OMNI 2014-02-07 09:00:00 
31 NOTE 2014-03-04 09:00:00 
40 RBY 2014-04-07 09:00:00 
65 AMP 2016-03-04 09:00:00 

#format dd/mm/YYYY 
df['dates'] = pd.to_datetime(df['dates'], dayfirst=True) 
print (df.sort_values('dates')) 
    symb    dates 
4 BLK 2014-03-01 09:00:00 
31 NOTE 2014-04-03 09:00:00 
0 BBR 2014-06-02 09:00:00 
21 HZ 2014-06-02 09:00:00 
24 OMNI 2014-07-02 09:00:00 
40 RBY 2014-07-04 09:00:00 
65 AMP 2016-04-03 09:00:00 

另一种解决方案是在read_csv使用参数parse_dates,如果格式dd/mm/YYYY添加dayfirst=True

import pandas as pd 
import numpy as np 
from pandas.compat import StringIO 

temp=u"""symb,dates 
BLK,01/03/2014 09:00:00 
BBR,02/06/2014 09:00:00 
HZ,02/06/2014 09:00:00 
OMNI,02/07/2014 09:00:00 
NOTE,03/04/2014 09:00:00 
AMP,03/04/2016 09:00:00 
RBY,04/07/2014 09:00:00""" 
#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), parse_dates=['dates']) 

print (df) 
    symb    dates 
0 BLK 2014-01-03 09:00:00 
1 BBR 2014-02-06 09:00:00 
2 HZ 2014-02-06 09:00:00 
3 OMNI 2014-02-07 09:00:00 
4 NOTE 2014-03-04 09:00:00 
5 AMP 2016-03-04 09:00:00 
6 RBY 2014-04-07 09:00:00 

print (df.dtypes) 
symb    object 
dates datetime64[ns] 
dtype: object 
print (df.sort_values('dates')) 
    symb    dates 
0 BLK 2014-01-03 09:00:00 
1 BBR 2014-02-06 09:00:00 
2 HZ 2014-02-06 09:00:00 
3 OMNI 2014-02-07 09:00:00 
4 NOTE 2014-03-04 09:00:00 
6 RBY 2014-04-07 09:00:00 
5 AMP 2016-03-04 09:00:00 

#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), parse_dates=['dates'], dayfirst=True) 

print (df) 
    symb    dates 
0 BLK 2014-03-01 09:00:00 
1 BBR 2014-06-02 09:00:00 
2 HZ 2014-06-02 09:00:00 
3 OMNI 2014-07-02 09:00:00 
4 NOTE 2014-04-03 09:00:00 
5 AMP 2016-04-03 09:00:00 
6 RBY 2014-07-04 09:00:00 

print (df.dtypes) 
symb    object 
dates datetime64[ns] 
dtype: object 

print (df.sort_values('dates')) 
    symb    dates 
0 BLK 2014-03-01 09:00:00 
4 NOTE 2014-04-03 09:00:00 
1 BBR 2014-06-02 09:00:00 
2 HZ 2014-06-02 09:00:00 
3 OMNI 2014-07-02 09:00:00 
6 RBY 2014-07-04 09:00:00 
5 AMP 2016-04-03 09:00:00