Как я могу отфильтровать список дат к списку месяцев в эликсире? - PullRequest
1 голос
/ 12 октября 2019

У меня есть список дат и соответствует этому количество продаж в месяц. Так что я хочу вместо дат, которые я хочу, отфильтровать по месяцам.

Это мой ввод

  ["2019-01-01", "900"],
  ["2019-01-01", "150"],
  ["2019-01-01", "150"],
  ["2019-01-01", "450"],
  ["2019-01-01", "180"],
  ["2019-01-01", "240"],
  ["2019-01-01", "300"],

Вывод, который я хочу: -

  ["2019-01-01 to 2019-01-31", "total sale of this month only"],
  ["2019-02-01 to 2019-02-28", "total sale of this month only"],

Теперь я хочу перечислить массив не только конкретной даты и продажи в этот день. Я хочу кое-что как выше, которое даст мне месяц и продажу того месяца.

month_sales = record
            |> Enum.filter(fn
                ["Date" | _ ] -> false
              _ -> true
            end)
            |> Enum.map(fn [head | tail ]-> [head, Enum.reduce(Enum.take(tail, -1), fn price, acc ->
                acc + price
             end)] end)
            |> IO.inspect()
  1. Итак, сначала я хочу перечислить это не по дате, а по месяцам.

Помогите мне, если кто-нибудь знает об этом

1 Ответ

1 голос
/ 13 октября 2019

Я предполагаю, что вы хотите, чтобы список всех значений для определенного месяца в конкретном году. Я немного изменил ваш ввод, чтобы включить случаи, когда год или месяц отличаются:

data = [
  ["2019-01-01", "900"],
  ["2019-01-01", "150"],
  ["2019-01-01", "150"],
  ["2019-01-01", "450"],
  ["2019-01-01", "180"],
  ["2018-01-01", "240"],
  ["2019-02-01", "300"]
]

Я думаю, что самый простой способ добиться этого - сначала разобрать это в соответствующие структуры данных, а затем использовать Enum.group_by длясгруппировать по {year, month} парам.

data
|> Enum.map(fn [date, value] ->
  # This is the part that parses it into a representation that's easier to work with
  [Date.from_iso8601!(date), String.to_integer(value)]
end)
|> Enum.group_by(
  # This is the key function - the items will be grouped by this
  fn [date, _value] -> {date.year, date.month} end,
  # This is the value function - it will gather the results of this function under the keys
  fn [_date, value] -> value end
)

В результате:

%{
  {2018, 1} => [240],
  {2019, 1} => [900, 150, 150, 450, 180],
  {2019, 2} => [300]
}

Таким образом, вы можете получить список значений для определенного месяца (в данном случае январь 2019) с помощью:

Map.get(result, {2019, 1}) # => [900, 150, 150, 450, 180]

Или, если вы хотите сумму:

Map.get(result, {2019, 1}) |> Enum.sum() # => 1830
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...