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

flo*_*oss 4 dataframe python-3.x 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
Run Code Online (Sandbox Code Playgroud)

我想sorthourly由唯一的数据ascending顺序。

我做了什么

我做了:

df.sort_values(by='time', ascending=True)
Run Code Online (Sandbox Code Playgroud)

但它的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
Run Code Online (Sandbox Code Playgroud)

这里date保持不变,但timeascending顺序。

jez*_*ael 6

如果需要按日期和时间进行排序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
Run Code Online (Sandbox Code Playgroud)

或者,如果日期不能更改,并且仅需DataFrame.groupby要按时间与lambda函数一起使用,则不进行分组-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
Run Code Online (Sandbox Code Playgroud)