我编写了一个简单的函数,它对序列的各个部分进行平均。第一个“列”有日期,第二个值。我要检查三个变量,开始日期 (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
)
这有两个问题:
- 因为 pob 不是序列的一部分,所以
match pob with
总是失败 - 如果日期不在标准 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)