如何在Python中按分组为数据添加日期顺序标记?
为分组数据集按日期添加组内顺序标记
我有一个按ID分组的数据集,需要为每个ID组内的记录按日期顺序添加从1开始的顺序标记(新增Order列)。
原数据集
| ID | 日期 |
|---|---|
| 1 | 10/11/20 |
| 1 | 15/11/20 |
| 1 | 13/12/20 |
| 1 | 16/12/20 |
| 2 | 10/11/19 |
| 2 | 15/11/19 |
| 2 | 13/12/20 |
| 2 | 16/12/20 |
| 3 | 10/11/19 |
| 3 | 15/11/19 |
| 3 | 13/12/20 |
| 3 | 16/12/20 |
| 4 | 10/11/19 |
| 4 | 15/11/19 |
| 4 | 13/12/20 |
| 4 | 16/12/20 |
目标数据集
| ID | 日期 | Order |
|---|---|---|
| 1 | 10/11/20 | 1 |
| 1 | 15/11/20 | 2 |
| 1 | 13/12/20 | 3 |
| 1 | 16/12/20 | 4 |
| 2 | 10/11/19 | 1 |
| 2 | 15/11/19 | 2 |
| 2 | 13/12/20 | 3 |
| 2 | 16/12/20 | 4 |
| 3 | 10/11/19 | 1 |
| 3 | 15/11/19 | 2 |
| 3 | 13/12/20 | 3 |
| 3 | 16/12/20 | 4 |
| 4 | 10/11/19 | 1 |
| 4 | 15/11/19 | 2 |
| 4 | 13/12/20 | 3 |
| 4 | 16/12/20 | 4 |
以下是几种常用工具的实现方法:
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版本)
- 确保日期列为日期格式(选中列 → 右键 → 设置单元格格式 → 日期)
- 在第一个Order单元格(如C2)输入公式:
=COUNTIFS($A$2:A2,A2,$B$2:B2,"<="&B2) - 下拉填充公式至所有行
方法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
相关产品推荐
相关产品推荐

