You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按Datetime分层排序并保留已排序索引

解决方案

要实现按name分组后组内按timestamp排序,同时保留name的原始出现顺序,可以用groupby结合apply的方式,关键是设置groupby的sort=False来避免分组被自动按字母排序。

步骤1:确保时间戳是datetime类型

首先需要把timestamp列转换为datetime格式(如果你的数据还不是的话),这样排序才会按时间逻辑生效:

import pandas as pd

# 转换timestamp为datetime类型
df['timestamp'] = pd.to_datetime(df['timestamp'])

步骤2:分组+组内排序

使用groupby按name分组,设置sort=False保留原始的name出现顺序,然后对每个分组应用sort_values按时间升序排序:

# 分组并组内排序,最后重置索引
df_sorted = df.groupby('name', sort=False).apply(lambda group: group.sort_values('timestamp')).reset_index(drop=True)

如果你的name已经是DataFrame的索引(即分层索引的一部分),只需要把groupby的参数改成level='name'即可:

df_sorted = df.groupby(level='name', sort=False).apply(lambda group: group.sort_values('timestamp')).reset_index(drop=True)

为什么直接用sort_values不行?

你之前执行的df.sort_values(by='timestamp', ascending=True)会把所有行按时间全局排序,完全打乱了name的分组结构,而我们需要的是每个name组内部独立按时间排序,同时组与组之间保持原来的顺序,groupby(sort=False)就能保证分组顺序和数据中name第一次出现的顺序一致,再结合组内排序就完美解决问题了。

内容的提问来源于stack exchange,提问作者Jeroen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:28:11