需要每月的最早日期

时间:2018-06-26 00:28:52

标签: 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)]

数据集继续。太大,无法粘贴到这里。

已编辑:

let data =
    Datacsv.GetSample().Rows
    |> Seq.map (fun ((yr,mon),(name,price)) 

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

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

1 个答案:

答案 0 :(得分: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)) 

我的第一个想法是,在您的代码中有两个名为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)) 

现在,我们将通过删除第二个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)))

请注意,我假设由于您的CSV文件的所有大写字母都有一列称为DATE(已转换为F#中行对象的DATE属性),因此它也包含{所有大写字母中的{1}}和NAME列也是如此。如果这些列还有其他名称,请相应地调整代码的PRICErow.NAME部分。