如何按英文日期格式而不是美国熊猫 .sort() 排序

Posted

技术标签:

【中文标题】如何按英文日期格式而不是美国熊猫 .sort() 排序【英文标题】:how to sort by english date format not american pandas .sort() 【发布时间】:2017-09-07 15:33:03 【问题描述】:
    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')) 的输出示例。

如您所见,它使用月份表示天数,反之亦然。知道如何解决这个问题吗?

【问题讨论】:

在读取时以 pandas read_csv 正确读取 dd/mm/yyyy 日期格式。使用选项parse_dates,你会想要dayfirst = True。与使用 read_csv 的大多数问题一样,解决方案是使用正确的选项第一次获得正确的 read_csv,而不是事后修复它。 【参考方案1】:

您可以使用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

【讨论】:

【参考方案2】:

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

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

【讨论】:

请注意 - .sort() 方法已弃用,请改用 .sort_values() @MaxU 好点,看到了警告,但因为 OP 使用 .sort() 而不引起混淆。【参考方案3】:

我不确定您是如何获取数据的,但如果您从某个来源(例如 CSV)导入数据,您可以使用 pandas.read_csv 并设置 parse_dates=True。问题是 dates 列的类型是什么?您可以使用`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 推荐的代码

【讨论】:

以上是关于如何按英文日期格式而不是美国熊猫 .sort() 排序的主要内容,如果未能解决你的问题,请参考以下文章

如何将熊猫中的日期时间列全部转换为同一时区

在数据框中编辑日期以在熊猫中显示年份

尽管是日期值,但使用显示日期时间的熊猫导入 excel 数据

将列字符串转换/解析为日期时间值 - 熊猫

如何格式化熊猫日期时间? [复制]

如何在熊猫中格式化日期格式