如何使用熊猫按降序排序日期和按升序排序时间

时间:2019-08-02 07:08:18

标签: python-3.x pandas dataframe

我的df看起来像这样。这是一个hourly数据集。

time                    Open
2017-01-03 09:00:00     5.2475
2017-01-03 08:00:00     5.2180
2017-01-03 07:00:00     5.2128
2017-01-02 09:00:00     5.4122
2017-01-02 08:00:00     5.2123
2017-01-02 07:00:00     5.2475
2017-01-01 09:00:00     5.2180
2017-01-01 08:00:00     5.2128
2017-01-01 07:00:00     5.4122

我想按sort顺序hourlyascending数据。

我做了什么?

我做到了:

df.sort_values(by='time', ascending=True)

但是它sort的整个值time,但是我只想sort time部分。

我的新df应该看起来像这样:

time                    Open
2017-01-03 07:00:00     5.2475
2017-01-03 08:00:00     5.2180
2017-01-03 09:00:00     5.2128
2017-01-02 07:00:00     5.4122
2017-01-02 08:00:00     5.2123
2017-01-02 09:00:00     5.2475
2017-01-01 07:00:00     5.2180
2017-01-01 08:00:00     5.2128
2017-01-01 09:00:00     5.4122

此处date保持不变,但time的顺序为ascending

1 个答案:

答案 0 :(得分:7)

如果需要按日期和时间排序,请创建新列以按DataFrame.assign进行排序,然后使用DataFrame.sort_values和升序按两个列进行排序,因为按dates进行的排序是按时间递减正在上升,最后使用DataFrame.drop删除帮助器列:

df1 = (df.assign(d=df['time'].dt.date,
                 t=df['time'].dt.time)
         .sort_values(['d','t'], ascending=[False, True])
         .drop(['d','t'], axis=1))
print (df1)
                 time    Open
2 2017-01-03 07:00:00  5.2128
1 2017-01-03 08:00:00  5.2180
0 2017-01-03 09:00:00  5.2475
5 2017-01-02 07:00:00  5.2475
4 2017-01-02 08:00:00  5.2123
3 2017-01-02 09:00:00  5.4122
8 2017-01-01 07:00:00  5.4122
7 2017-01-01 08:00:00  5.2128
6 2017-01-01 09:00:00  5.2180

或者如果日期不能更改并且仅需要按时间排序,请使用带有lambda函数的DataFrame.groupby-groupby不排序,因为sort=False参数和group_keys=False是为了避免MultiIndex

df1 = (df.groupby(df['time'].dt.date, sort=False, group_keys=False)
         .apply(lambda x: x.sort_values('time')))
print (df1)
                 time    Open
2 2017-01-03 07:00:00  5.2128
1 2017-01-03 08:00:00  5.2180
0 2017-01-03 09:00:00  5.2475
5 2017-01-02 07:00:00  5.2475
4 2017-01-02 08:00:00  5.2123
3 2017-01-02 09:00:00  5.4122
8 2017-01-01 07:00:00  5.4122
7 2017-01-01 08:00:00  5.2128
6 2017-01-01 09:00:00  5.2180