如何计算每个ID在指定日期范围内距上次事件的天数?
生成指定日期范围内每个ID的日期序列及距上次事件天数
输入数据集
id Date 1001 2025-06-20 1002 2025-06-24 1002 2025-06-20 1002 2025-06-19
需求说明
在2025-06-19至2025-06-24的日期范围内,生成每个ID的所有日期组合,并计算该日期距离最近一次前置事件的天数,预期输出如下:
id Date LastDate 1001 2025-06-24 4 1001 2025-06-23 3 1001 2025-06-22 2 1001 2025-06-21 1 1001 2025-06-20 0 1001 2025-06-19 NA 1002 2025-06-24 0 1002 2025-06-23 3 1002 2025-06-22 2 1002 2025-06-21 1 1002 2025-06-20 0 1002 2025-06-19 0
实现方案
R 版本
使用dplyr、lubridate和tidyr包处理:
library(dplyr) library(lubridate) library(tidyr) # 构造输入数据 df <- tibble( id = c(1001, 1002, 1002, 1002), Date = ymd(c("2025-06-20", "2025-06-24", "2025-06-20", "2025-06-19")) ) # 定义目标日期范围 date_range <- seq(ymd("2025-06-19"), ymd("2025-06-24"), by = "day") # 生成结果 result <- df %>% distinct(id) %>% crossing(Date = date_range) %>% left_join(df, by = c("id", "Date")) %>% group_by(id) %>% arrange(Date) %>% # 向前填充最近的事件日期 fill(Date.y, .direction = "down") %>% # 计算天数差,无前置事件则为NA mutate(LastDate = ifelse(is.na(Date.y), NA, as.integer(Date - Date.y))) %>% select(id, Date, LastDate) %>% arrange(id, desc(Date)) # 输出结果 print(result, n = Inf)
Python 版本
使用pandas和numpy包处理:
import pandas as pd import numpy as np # 构造输入数据 df = pd.DataFrame({ 'id': [1001, 1002, 1002, 1002], 'Date': pd.to_datetime(['2025-06-20', '2025-06-24', '2025-06-20', '2025-06-19']) }) # 定义目标日期范围 date_range = pd.date_range(start='2025-06-19', end='2025-06-24', freq='D') # 生成每个ID的全日期组合 all_dates = df[['id']].drop_duplicates().assign(key=1).merge( pd.DataFrame({'Date': date_range, 'key': 1}), on='key' ).drop('key', axis=1) # 合并事件日期并向前填充 result = all_dates.merge(df, on=['id', 'Date'], how='left', suffixes=('', '_event')) result = result.sort_values(['id', 'Date']).groupby('id').ffill().reset_index(drop=True) # 计算距上次事件的天数 result['LastDate'] = np.where( result['Date_event'].isna(), np.nan, (result['Date'] - result['Date_event']).dt.days ) # 调整顺序并输出 result = result[['id', 'Date', 'LastDate']].sort_values(['id', 'Date'], ascending=[True, False]) print(result.to_string(index=False))
内容的提问来源于stack exchange,提问作者Bambs
相关产品推荐
相关产品推荐

