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

如何用Purrr map()函数批量按自定义日期区间处理销售数据

解决方案:用Purrr批量迭代日期区间的销售数据汇总

核心思路

利用purrr::map2()同时遍历起始/结束日期对,对每一组区间执行数据过滤+自定义汇总,同时兼容缺失/重复数据、支持自定义区间间隔与汇总逻辑。


步骤1:准备数据(替换为你的真实数据即可)

先构造贴合真实场景的示例数据,包含重复日期、缺失日期记录:

library(dplyr)
library(lubridate)
library(purrr)

# 模拟带重复、缺失值的销售数据
set.seed(123)
sold_data <- tibble(
  sale_date = sample(seq(as.Date("2020-01-01"), as.Date("2023-12-31"), by = "day"), 1000, replace = TRUE),
  amount = runif(1000, 100, 1000),
  product_id = sample(1:10, 1000, replace = TRUE)
) %>% 
  add_row(sale_date = NA, amount = 500, product_id = 3) %>% # 缺失日期记录
  bind_rows(slice(., 1:5)) # 重复交易记录

步骤2:生成自定义间隔的日期区间(已有start/end向量可跳过)

写一个参数化函数,支持生成任意月数间隔的起止日期对:

# 生成自定义间隔的日期区间
generate_date_intervals <- function(start_date, end_date, interval_months = 3) {
  starts <- seq(start_date, end_date, by = paste(interval_months, "months"))
  # 修正最后一个区间的边界,避免超出指定结束日期
  ends <- pmin(starts %m+% months(interval_months) - days(1), end_date)
  tibble(interval_start = starts, interval_end = ends)
}

# 示例:生成2020-2023年每3个月的区间
date_intervals <- generate_date_intervals(
  start_date = as.Date("2020-01-01"),
  end_date = as.Date("2023-12-31"),
  interval_months = 3
)

步骤3:自定义汇总函数(兼容缺失/重复数据)

按你的业务需求调整汇总逻辑,示例包含缺失值过滤、重复数据去重:

# 自定义汇总函数:适配缺失/重复数据
n_month_summary <- function(data, date_col = sale_date) {
  data %>% 
    filter(!is.na({{ date_col }})) %>% # 过滤缺失日期的无效记录
    distinct({{ date_col }}, product_id, amount, .keep_all = TRUE) %>% # 去重重复交易(按需调整规则)
    summarise(
      total_sales = sum(amount, na.rm = TRUE),
      avg_sale = mean(amount, na.rm = TRUE),
      total_orders = n(),
      unique_products = n_distinct(product_id, na.rm = TRUE)
    )
}

步骤4:用Purrr批量执行迭代汇总

使用map2()遍历起止日期对,自动完成所有区间的过滤+汇总:

# 批量迭代:遍历每个日期区间,生成汇总结果
batch_summary <- map2(
  .x = date_intervals$interval_start,
  .y = date_intervals$interval_end,
  .f = function(start, end) {
    sold_data %>% 
      filter(sale_date >= start & sale_date <= end) %>% # 过滤当前区间数据
      n_month_summary() %>% # 应用自定义汇总逻辑
      mutate(interval_start = start, interval_end = end) %>% # 标记所属区间
      relocate(interval_start, interval_end) # 将区间信息前置,便于查看
  }
) %>% 
  bind_rows() # 将列表格式的结果合并为单个数据框

关键特性说明

  1. 自定义区间间隔:通过generate_date_intervals()的interval_months参数可设置任意月数,也可修改函数支持按天/季度间隔。若你已有现成的start_24、end_24向量,直接替换map2()的.x和.y即可。
  2. 兼容缺失/重复数据:汇总函数中加入了缺失值过滤和重复数据去重逻辑,你可根据业务需求调整distinct()的去重规则(比如按订单ID而非产品ID)。
  3. 支持自定义汇总函数:只需替换map2()中的n_month_summary()为你的自定义函数,只要该函数接受数据框输入即可。若需传递额外参数,可使用purrr::partial()封装,比如partial(your_summary_func, extra_param = 10)。
  4. 边界处理:生成日期区间时自动修正最后一个区间的结束日期,避免超出用户指定的时间范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:14:56