需要采取每个月的最早日期

San*_*aus 1 f#

我有一个日期如下所示的数据集.我需要从每个月的最早日期开始.我该怎么做呢?

[(1/2/2004 12:00:00 AM);(1/5/2004 12:00:00 AM);
 (1/6/2004 12:00:00 AM);(1/7/2004 12:00:00 AM);
 (1/8/2004 12:00:00 AM);(1/9/2004 12:00:00 AM);
 (1/12/2004 12:00:00 AM);(1/13/2004 12:00:00 AM);
 (1/14/2004 12:00:00 AM);(1/15/2004 12:00:00 AM);
 (1/16/2004 12:00:00 AM);(1/19/2004 12:00:00 AM);
 (1/20/2004 12:00:00 AM);(1/21/2004 12:00:00 AM);
 (1/22/2004 12:00:00 AM);(1/23/2004 12:00:00 AM);
 (1/26/2004 12:00:00 AM);(1/27/2004 12:00:00 AM);
 (1/28/2004 12:00:00 AM);(1/29/2004 12:00:00 AM);
 (1/30/2004 12:00:00 AM);(2/2/2004 12:00:00 AM)]
Run Code Online (Sandbox Code Playgroud)

数据集继续.这里粘贴太大了.

编辑:

let data =
    Datacsv.GetSample().Rows
    |> Seq.map (fun ((yr,mon),(name,price)) 
Run Code Online (Sandbox Code Playgroud)

对于(name,price)最后一行,我收到错误:

TermStructure.fsx(33,36): error FS0001: This expression was expected to have type
    'CsvProvider<...>.Row'    
but here has type
    ''a * 'b'    
Run Code Online (Sandbox Code Playgroud)

rmu*_*unn 5

你快到了.但是你的最后一行(name, price)不太对劲.当你打电话时Seq.head data,那是什么data时候?答案:行列表.所以Seq.head会给你一个CSV行.您无法将CSV行与(name, price)元组匹配,这就是错误消息告诉您的内容.由于输入是一行,它期待一个功能,((yr, mon), row)你给了它((yr, mon), (name, price)).

在你的情况下,我可能会备份一个步骤,而不是仅仅执行Seq.head data并将其提供给另一个Seq.map,我将在一次操作中执行此操作.我会一步一步向你展示我的建议.首先,这是您编写的代码,它收到错误:

let data =
    Datacsv.GetSample().Rows
    |> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
    |> Seq.map (fun ((yr,mon),data) -> ((yr, mon), Seq.head data))
    |> Seq.map (fun ((yr,mon),(name,price)) 
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是data在代码中命名两个不同的东西会让人感到困惑.所以让我们在第一个中更改变量名称Seq.map.你data在该函数中命名的是一系列行,所以让我们rows改为:

let data =
    Datacsv.GetSample().Rows
    |> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
    |> Seq.map (fun ((yr,mon),rows) -> ((yr, mon), Seq.head rows))
    |> Seq.map (fun ((yr,mon),(name,price)) 
Run Code Online (Sandbox Code Playgroud)

现在我们将Seq.map通过删除它并将其操作合并到第一个来修复第二个Seq.map,如下所示:

let data =
    Datacsv.GetSample().Rows
    |> Seq.groupBy (fun row -> row.DATE.Year,row.DATE.Month)
    |> Seq.map (fun ((yr,mon),rows) ->
        let row = Seq.head rows
        ((yr, mon), (row.NAME, row.PRICE)))
Run Code Online (Sandbox Code Playgroud)

请注意,我假设您的CSV文件中有一个名为DATEall of cap(DATE在F#中已转换为行对象属性)的列,因此它也包含所有大写的列NAMEPRICE列.如果这些列被命名为其他列,请相应地调整row.NAMErow.PRICE部分代码.