首页 > 解决方案 > 如何使用 Pandas 按降序排序日期和按升序排序时间

问题描述

我的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获取hourly唯一的数据。ascending

我做了什么?

我做了:

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

但它sort的全部价值time不过我只想sorttime部分。

我的新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

标签: python-3.xpandasdataframe

解决方案


如果需要按日期和时间排序,则创建新列以按 排序,然后使用和 升序参数DataFrame.assign按两列排序,因为按降序排序,按时间升序,最后使用 删除辅助列:DataFrame.sort_valuesdatesDataFrame.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

或者,如果日期不能更改并且只需要按时间排序,则使用DataFrame.groupbylambda 函数 - groupby 不排序,因为sort=False参数 andgroup_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

推荐阅读