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

为含日期的DataFrame添加以周为单位的时间间隔列

解决方案:为DataFrame新增基于分组起始日期的周数差列

步骤1:转换日期类型

原始数据中的Date列是字符型,必须先转为日期格式才能进行时间计算:

# 转换df1的Date列
df1$Date <- as.Date(df1$Date)
# 转换df2的Date列
df2$Date <- as.Date(df2$Date)

步骤2:提取每个Id的起始日期

从df2中按Id分组,提取每个Id的最早(首个)日期,生成起始日期映射表:

# Base R实现
start_dates <- aggregate(Date ~ Id, df2, FUN = min)

# 或用dplyr实现(需先加载包)
# library(dplyr)
# start_dates <- df2 %>% 
#   group_by(Id) %>% 
#   summarise(start_date = min(Date)) %>% 
#   ungroup()

步骤3:合并起始日期并计算周数差

将起始日期映射表与df1合并,计算每个Date与对应起始日期的天数差,再除以7得到周数并保留两位小数:

# 合并数据(保留df1所有行)
df1 <- merge(df1, start_dates, by = "Id", all.x = TRUE)

# 计算周数差
df1$t <- round(difftime(df1$Date.x, df1$Date.y, units = "days") / 7, 2)

# 整理列名和顺序
df1 <- df1[, c("Id", "Date.x", "t")]
names(df1)[2] <- "Date"

处理df1中无对应Id的情况

如果df1存在df2没有的Id(比如示例中的Id=2),可手动补充该Id的起始日期:

# 补充Id=2的起始日期(匹配期望结果的起始日期为2004-12-26)
start_dates <- rbind(start_dates, data.frame(Id = "2", Date = as.Date("2004-12-26")))

# 重新合并计算
df1 <- merge(df1, start_dates, by = "Id", all.x = TRUE)
df1$t <- round(difftime(df1$Date, df1$Date.y, units = "days") / 7, 2)
df1 <- df1[, c("Id", "Date", "t")]

最终结果

运行代码后得到期望的df1形态:

> df1
  Id       Date     t
1  1 2005-02-05  7.14
2  1 2005-04-05 14.29
3  2 2005-01-15  2.86
4  2 2005-02-11  6.71

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:18