Julia DataFrame滚动360天销售额精确求和方案咨询
在Julia DataFrame中计算过去360天滚动销售总额
下面提供两种实现方式,分别适配小数据集和大数据集场景:
方法一:直接逐行筛选(适合小数据集)
先确保数据按日期排序,再对每个日期筛选出过去360天内的销售额并求和:
using DataFrames, Dates # 替换为你的实际DataFrame df = DataFrame( date = Date(2020,1,1):Day(1):Date(2023,12,31), sales = rand(1:100, length(Date(2020,1,1):Day(1):Date(2023,12,31))) ) # 按日期排序(核心前置步骤,保证筛选逻辑正确) sort!(df, :date) # 添加滚动360天销售额列 df[!, :rolling_360d_sales] = [sum(df.sales[(df.date .>= d - Day(360)) .& (df.date .<= d)]) for d in df.date]
方法二:累积和+二分查找(适合大数据集,效率更高)
利用累积和数组与二分查找定位区间,将时间复杂度从O(n²)优化至O(n log n):
using DataFrames, Dates # 先确保数据按日期排序 sort!(df, :date) # 计算销售额累积和 cum_sales = cumsum(df.sales) # 对每个日期,用二分查找定位过去360天的起始索引 start_indices = searchsortedfirst.(Ref(df.date), df.date .- Day(360)) # 通过累积和快速计算区间和 df[!, :rolling_360d_sales] = map(enumerate(start_indices)) do (i, start_idx) cum_sales[i] - (start_idx > 1 ? cum_sales[start_idx-1] : 0) end
注意事项
- 必须先对DataFrame按日期列排序,否则筛选或索引定位会出错
- 若日期列不是
Date类型,先通过df.date = Date.(df.date)转换为标准日期类型 - 存在重复日期时,两种方法都能正确计算区间内的所有销售额
内容的提问来源于stack exchange,提问作者mpgk444
相关产品推荐
相关产品推荐

