нужно взять самую раннюю дату каждого месяца - PullRequest
0 голосов
/ 26 июня 2018

У меня есть набор данных с датами, показанными ниже.Мне нужно взять самую раннюю дату каждого месяца за все годы.Как мне поступить?

[(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 голосов
/ 26 июня 2018

Ты почти у цели.Но ваша последняя строка с (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 во всех заглавных буквах (который был переведен в *Свойство 1028 * для объектов строки в F #), оно также содержит столбцы NAME и PRICE во всех заглавных буквах.Если эти столбцы называются как-то иначе, измените части кода row.NAME и row.PRICE соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...