我有一个数据集,其日期如下所示。我需要把所有月份的最早日期定为最早的日期。我将如何去做?
[(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'
答案 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
列也是如此。如果这些列还有其他名称,请相应地调整代码的PRICE
和row.NAME
部分。