2017-04-12 75 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