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

如何按ID对重复日期计数生成period列?求解决方案

问题解决:基于ID对日期生成连续编号的period列

输入数据

ID  Date
A   20/05/2023
A   20/05/2023
B   21/05/2023
B   22/05/2023
B   23/05/2023
C   22/05/2023
C   23/05/2023
D   22/05/2023
D   22/05/2023
D   23/05/2023
D   24/05/2023

期望输出

ID     Date       period
A   20/05/2023    1
A   20/05/2023    1 
B   21/05/2023    1 
B   22/05/2023    2
B   23/05/2023    3
C   22/05/2023    1
C   23/05/2023    2 
D   22/05/2023    1
D   22/05/2023    1
D   23/05/2023    2 
D   24/05/2023    3

解决方案

Python(Pandas)

核心逻辑:按ID分组后,对组内日期用稠密排名(dense rank)——相同日期共享同一编号,不同日期按升序生成连续序号,完全匹配需求。

import pandas as pd

# 构造示例数据(实际可替换为读取你的数据源)
df = pd.DataFrame({
    'ID': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'D', 'D', 'D'],
    'Date': ['20/05/2023', '20/05/2023', '21/05/2023', '22/05/2023', '23/05/2023',
             '22/05/2023', '23/05/2023', '22/05/2023', '22/05/2023', '23/05/2023', '24/05/2023']
})

# 转换为日期格式,确保排序逻辑正确
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

# 生成period列:分组后对日期做稠密排名
df['period'] = df.groupby('ID')['Date'].transform(lambda x: x.rank(method='dense', ascending=True).astype(int))

# 转回原日期字符串格式(可选,根据需求调整)
df['Date'] = df['Date'].dt.strftime('%d/%m/%Y')

print(df)

R语言(dplyr)

用稠密排名实现相同效果:

library(dplyr)

# 构造示例数据
df <- data.frame(
  ID = c("A", "A", "B", "B", "B", "C", "C", "D", "D", "D", "D"),
  Date = c("20/05/2023", "20/05/2023", "21/05/2023", "22/05/2023", "23/05/2023",
           "22/05/2023", "23/05/2023", "22/05/2023", "22/05/2023", "23/05/2023", "24/05/2023")
)

# 转换日期格式
df$Date <- as.Date(df$Date, format = "%d/%m/%Y")

# 分组生成period列
df <- df %>%
  group_by(ID) %>%
  mutate(period = dense_rank(Date)) %>%
  ungroup()

# 转回原日期格式(可选)
df$Date <- format(df$Date, "%d/%m/%Y")

print(df)

为什么freq不行?

freq函数的作用是统计每个值的出现次数,而你需要的是同一ID下不同日期的顺序编号,相同日期共享同一编号,所以稠密排名(dense rank)才是对应需求的方法。

内容的提问来源于stack exchange,提问作者BD'auria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:24:56