如何高效为DataFrame每日时间戳按运行顺序分配1-3的Category编号
实现方案
前置准备
首先确保DataFrame中的Timestamp列已转换为pandas datetime类型,否则无法正确按时间排序、分组:
import pandas as pd df['Timestamp'] = pd.to_datetime(df['Timestamp'])
最高效实现方案(推荐)
使用groupby + cumcount的向量化操作,是所有方案中性能最优的选择,50万行数据处理耗时通常不超过10ms:
- 先按
Timestamp列升序排序(如果你的原始数据已经保证全局时间递增,可跳过这一步进一步节省时间)
df = df.sort_values('Timestamp', ignore_index=True)
- 按天分组后按顺序计数,计数结果加1即为1/2/3的分类编号:
# 用dt.floor('d')按天截断时间,分组效率高于dt.date df['Category'] = df.groupby(df['Timestamp'].dt.floor('d')).cumcount() + 1
特殊场景兼容方案
如果同一天内存在完全相同的时间戳,且需要相同时间戳的记录分配相同的分类编号,可使用rank方法实现SQL中dense_rank的效果:
df['Category'] = df.groupby(df['Timestamp'].dt.floor('d'))['Timestamp'].rank(method='dense').astype(int)
性能说明
- 两种方案均为pandas原生向量化实现,避免了Python层的循环遍历,远快于自定义apply、逐行遍历等实现方式
- 50万行规模下无需使用分布式计算工具,单机pandas即可毫秒级完成计算
内容的提问来源于stack exchange,提问作者ssiftekhar
相关产品推荐
相关产品推荐

