0

我编写了一个简单的函数,它对序列的各个部分进行平均。第一个“列”有日期,第二个值。我要检查三个变量,开始日期 (std) 结束日期 (edd) 和营业时间(定义为 8-20 Mo-Fr = pob:string)。

这是功能:

let internal aggrAvg data std edd pob =
data
|> Seq.averageBy (fun(a,b) -> 
    match a with 
    | r when isbetween r std edd ->
        match pob with
        |"Peak" when (ispeak a) -> b
        |"Offpeak" when (not (ispeak a)) -> b
        | _ -> b   
    | _ -> 0.0
    )

这有两个问题:

  1. 因为 pob 不是序列的一部分,所以match pob with总是失败
  2. 如果日期不在标准 edd 之间,我想跳过并且不将 0.0 分配给 averageby

有什么想法可以解决这两个问题吗?谢谢

根据马修的回答更新工作解决方案

let internal aggrAvg data std edd pob =
    let ndata = data |> Seq.filter (fun (date, _) -> isbetween date std edd)
    match pob with
    | "Peak" -> ndata |> Seq.filter (fun (date, _) -> ispeak date) |> Seq.averageBy (fun (_, value) -> value)
    | "Offpeak" -> ndata |> Seq.filter (fun (date, _) -> not(ispeak date)) |> Seq.averageBy (fun (_, value) -> value)
    | _ -> ndata |> Seq.averageBy (fun (_, value) -> value) 
4

1 回答 1

2

因为 pob 不是序列的一部分,所以匹配 pob 总是失败

无论如何,它总是导致值 b,它的目的是什么?

要跳过不在您的范围内的日期,您可以在进行平均之前过滤序列:

let internal aggrAvg data std edd pob =
    data
        |> Seq.filter (fun (date, _) -> isbetween date std edd)
        |> Seq.averageBy (fun (_, value) -> value)

更新的答案:

let internal aggrAvg data std edd pob =
    data 
        |> Seq.filter (fun (date, _) -> 
            let dateInRange = isbetween date std edd
            match pob with
            | "Peak" -> ispeak date && dateInRange
            | "Offpeak" -> not(ispeak date) && dateInRange
            | _ -> dateInRange)
        |> Seq.averageBy (fun (_, value) -> value)
于 2013-10-18T08:33:28.283 回答