我有一个日期如下所示的数据集.我需要从每个月的最早日期开始.我该怎么做呢?
[(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)
你快到了.但是你的最后一行(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#中已转换为行对象属性)的列,因此它也包含所有大写的列NAME和PRICE列.如果这些列被命名为其他列,请相应地调整row.NAME和row.PRICE部分代码.