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

基于现有折扣列自动计算各折扣在指定月份的有效天数

多折扣场景下的有效天数自动化计算

问题说明

现有包含产品、折扣及对应起始日期的DataFrame,需计算每个折扣在指定参考月份(示例为2024年4月)的有效天数,并将单折扣场景的计算逻辑扩展至多折扣(3个及以上)场景,实现自动化处理。

原始DataFrame示例

product disc1 disc2 dateini1     dateini2   total
p1      10    2     2024-04-05  2024-04-20 2
p2      5     4     2020-01-20  2024-04-15 2
p3      10    NA    2022-10-20  NA         1
p4      10    NA    2024-04-10  NA         1

期望计算结果

product disc1 disc2 dateini1     dateini2    ndays1 ndays2
p1      10    2     2024-04-05  2024-04-20  15     11        
p2      5     4     2020-01-20  2024-04-15  15     15
p3      10    NA    2022-10-20  NA          30
p4      10    NA    2024-04-10  NA          21

已实现的单折扣计算代码

per_actual <- as.Date("2024-04-01")

for (i in 1:nrow(df)) {
  if (df$total[i] == 1 & df$dateini1[i] <= per_actual) {
    df$ndays1[i] <- days_in_month(per_actual)
  } else {
    df$ndays1[i] <- as.Date(days_in_month(per_actual) + per_actual) - df$dateini1[i]
  }
}

多折扣场景自动化实现方案

核心思路

通过自动识别DataFrame中的折扣编号(从discX、dateiniX列的数字后缀提取),循环处理每个折扣对应的起始日期列,复用单折扣的计算逻辑,无需手动编写多组重复代码。

完整实现代码

library(lubridate)

# 定义参考月份
per_actual <- as.Date("2024-04-01")
month_end <- ceiling_date(per_actual, "month") - days(1)
total_days_month <- days_in_month(per_actual)

# 自动提取所有折扣的编号(匹配disc后的数字后缀)
disc_numbers <- unique(sub("disc(\\d+)", "\\1", grep("^disc\\d+$", colnames(df), value = TRUE)))

# 循环处理每个折扣组
for (num in disc_numbers) {
  date_col <- paste0("dateini", num)
  ndays_col <- paste0("ndays", num)
  
  # 仅处理日期非NA的行
  valid_rows <- which(!is.na(df[[date_col]]))
  
  # 初始化有效天数列
  df[[ndays_col]] <- NA_real_
  
  # 计算每个有效行的天数
  for (i in valid_rows) {
    if (df$total[i] == 1 & df[[date_col]][i] <= per_actual) {
      df[[ndays_col]][i] <- total_days_month
    } else {
      # 取起始日期与参考月第一天的较大值,计算到月末的天数
      start_date <- max(df[[date_col]][i], per_actual)
      df[[ndays_col]][i] <- as.numeric(month_end - start_date + 1)
    }
  }
}

代码说明

  1. 自动识别折扣编号:通过正则匹配列名中的discX格式,提取所有折扣的数字编号,支持任意数量的折扣列。
  2. 统一日期预处理:提前计算参考月的月末日期和总天数,避免循环中重复计算。
  3. 动态列操作:通过字符串拼接获取对应dateiniX列,并生成ndaysX列,无需手动指定列名。
  4. 兼容NA值:自动跳过日期为NA的行,对应ndays列保留NA,符合原始数据逻辑。
  5. 逻辑复用:完全沿用单折扣场景的计算规则,确保结果一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:27:42