我的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
,但是我只想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
。
答案 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