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

如何在Python中按分组为数据添加日期顺序标记?

为分组数据集按日期添加组内顺序标记

我有一个按ID分组的数据集,需要为每个ID组内的记录按日期顺序添加从1开始的顺序标记(新增Order列)。

原数据集

ID日期
110/11/20
115/11/20
113/12/20
116/12/20
210/11/19
215/11/19
213/12/20
216/12/20
310/11/19
315/11/19
313/12/20
316/12/20
410/11/19
415/11/19
413/12/20
416/12/20

目标数据集

ID日期Order
110/11/201
115/11/202
113/12/203
116/12/204
210/11/191
215/11/192
213/12/203
216/12/204
310/11/191
315/11/192
313/12/203
316/12/204
410/11/191
415/11/192
413/12/203
416/12/204

以下是几种常用工具的实现方法:

1. Python Pandas 实现

先将日期列转换为datetime类型,再通过分组排序添加顺序标记:

import pandas as pd

# 构造数据集(实际可通过read_csv等读取)
df = pd.DataFrame({
    'ID': [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4],
    '日期': ['10/11/20','15/11/20','13/12/20','16/12/20',
            '10/11/19','15/11/19','13/12/20','16/12/20',
            '10/11/19','15/11/19','13/12/20','16/12/20',
            '10/11/19','15/11/19','13/12/20','16/12/20']
})

# 转换日期格式为datetime(注意是DD/MM/YY)
df['日期'] = pd.to_datetime(df['日期'], format='%d/%m/%y')

# 方法1:使用rank保留原数据顺序
df['Order'] = df.groupby('ID')['日期'].rank(method='first').astype(int)

# 方法2:先排序再用cumcount(会改变原数据顺序)
# df = df.sort_values(['ID', '日期'])
# df['Order'] = df.groupby('ID').cumcount() + 1

print(df)

2. SQL 实现

利用窗口函数ROW_NUMBER()按ID分组、日期排序生成顺序标记:

SELECT 
    ID,
    日期,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY STR_TO_DATE(日期, '%d/%m/%y')) AS `Order`
FROM your_table;

注意:不同数据库的日期转换函数有差异:

  • MySQL:STR_TO_DATE(日期, '%d/%m/%y')
  • Oracle:TO_DATE(日期, 'DD/MM/YY')
  • SQL Server:CONVERT(DATE, 日期, 3)

3. Excel 实现

方法1:普通公式(兼容所有Excel版本)

  1. 确保日期列为日期格式(选中列 → 右键 → 设置单元格格式 → 日期)
  2. 在第一个Order单元格(如C2)输入公式:
    =COUNTIFS($A$2:A2,A2,$B$2:B2,"<="&B2)
    
  3. 下拉填充公式至所有行

方法2:动态数组公式(Excel 365/2021+)

在C2单元格输入以下公式,Excel会自动填充所有行:

=BYROW(A2:A17,LAMBDA(x,COUNTIFS(A:A,x,B:B,"<="&INDEX(B:B,ROW(x)))))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:24:22