将列转换为日期格式(Pandas 数据框)

Convert Column to Date Format (Pandas Dataframe)

我有一个 pandas 数据框如下:

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

我想按 Date 排序,但该列只是 object.

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

所以现在我想弄清楚如何让 numpy 将 'American' 日期转换为 ISO 标准,这样我就可以使它们成为日期对象,这样我就可以按它们进行排序。

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

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

为了以后的搜索,您可以更改排序语句:

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

快速简洁。但它会更改您尝试排序的 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

sort 方法已 deprecated and replaced with sort_values。使用 df['Date']=pd.to_datetime(df['Date'])

转换为日期时间对象后
df.sort_values(by=['Date'])

注意:要对in-placeand/or进行降序排序(最近的在前):

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

可以使用以下代码读取包含日期列的数据:

data = pd.csv(file_path,parse_dates=[date_column])

使用上述代码行读取数据后,可以使用 pd.date_time() 访问包含日期信息的列,例如:

pd.date_time(data[date_column], format = '%d/%m/%y')

根据需要更改日期格式。

因为 pandas >= 1.0.0 我们在 DataFrame.sort_values 中有 key 参数。这样我们就可以通过指定一个键对数据帧进行排序,而无需调整原始数据帧:

df.sort_values(by="Date", key=pd.to_datetime)
  Symbol        Date
0      A  02/20/2015
2      A  08/21/2015
1      A  01/15/2016
data['Date'] = data['Date'].apply(pd.to_datetime) # non-null datetime64[ns]