Фильтровать диапазон дат от объекта с указанием даты в качестве ключа в Ruby - PullRequest
0 голосов
/ 02 мая 2018

Я использую API AlphaVantage (https://www.alphavantage.co/documentation/#daily) для получения ежедневных данных о запасах. К сожалению, API не предлагает возможность получать только данные за определенный диапазон дат. Он всегда возвращает все данные за последние 20 лет Возвращаемый хэш содержит дату в качестве ключа:

 "2016-12-08": {
        "1. open": "61.3000",
        "2. high": "61.5800",
        "3. low": "60.8400",
        "4. close": "61.0100",
        "5. volume": "21220753"
    },
    "2016-12-07": {
        "1. open": "60.0100",
        "2. high": "61.3800",
        "3. low": "59.8000",
        "4. close": "61.3700",
        "5. volume": "30808969"
    },
    "2016-12-06": {
        "1. open": "60.4300",
        "2. high": "60.4600",
        "3. low": "59.8000",
        "4. close": "59.9500",
        "5. volume": "19907035"
    },

Как выбрать только записи для заданного временного диапазона, например. 2016-12-01 до 2016-12-10? Я понимаю, что всегда буду получать полные данные и буду выполнять фильтрацию по возвращенному хешу.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы можете использовать select, вот так:

response = {
  "2016-12-08": {
    "1. open": "61.3000",
    "2. high": "61.5800",
    "3. low": "60.8400",
    "4. close": "61.0100",
    "5. volume": "21220753"
  },
  "2016-12-07": {
    "1. open": "60.0100",
    "2. high": "61.3800",
    "3. low": "59.8000",
    "4. close": "61.3700",
    "5. volume": "30808969"
  },
  "2016-12-06": {
    "1. open": "60.4300",
    "2. high": "60.4600",
    "3. low": "59.8000",
    "4. close": "59.9500",
    "5. volume": "19907035"
  }
}

start_date = Date.new(2016, 12, 6)
end_date   = Date.new(2016, 12, 7)

response.select { |k, _| Date.parse(k.to_s) >= start_date && Date.parse(k.to_s) <= end_date }
#=> {
#    :"2016-12-07"=>{:"1. open"=>"60.0100", :"2. high"=>"61.3800", :"3. low"=>"59.8000", :"4. close"=>"61.3700", :"5. volume"=>"30808969"},
#    :"2016-12-06"=>{:"1. open"=>"60.4300", :"2. high"=>"60.4600", :"3. low"=>"59.8000", :"4. close"=>"59.9500", :"5. volume"=>"19907035"}
#   } 
0 голосов
/ 02 мая 2018

Один из способов сделать это - использовать Hash#select и диапазон:

def filter_dates(hash, first, last)
  range = Date.parse(first)..Date.parse(last)
  hash.select { |k, _| range.include?(Date.parse(k)) }
end
0 голосов
/ 02 мая 2018

Поскольку у вас уже есть хеш, вы можете попробовать использовать select:

hash.select { |k, _| Date.parse(k) < Date.parse("2016-12-10") && Date.parse(k) > Date.parse("2016-12-01")}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...