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

如何计算每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:34:56