Module: Statlysis::TimeSeries

Defined in:
lib/statlysis/timeseries.rb

Class Method Summary collapse

Class Method Details

.parse(range, opts = {}) ⇒ Object

range支持如下三种时间范围格式

20121201 20121221
Time.zone.parse('20121221')
Time.zone.parse('20121201')..Time.zone.parse('20121221')

opts支持:hour, :day, :week, :month等时间单位 返回的结果为时间范围内的序列数组



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/statlysis/timeseries.rb', line 11

def self.parse range, opts = {}
  # removed :utc => true, no effect.
  # and so does :offset => nil
  opts = opts.reverse_merge :unit => :day
  unit = opts[:unit]
  zone = opts[:zone] || Statlysis.default_time_zone || Time.zone

  range = Range.new(*range.split.map {|i| Time.zone.parse(i).in_time_zone(zone) }) if range.is_a?(String)

  begin_unit = "beginning_of_#{unit}".to_sym
  array = if range.respond_to?(:to_datetime)
    [range.in_time_zone(zone).send(begin_unit)]
  elsif range.is_a?(Range)
    ary = [range.first.in_time_zone(zone), range.last.in_time_zone(zone)].map(&begin_unit).uniq

    _ary = []
    _ary.push ary[0]
    tmp = ary[0]
    loop do
      tmp += 1.send(unit)
      break if tmp >= ary[-1]
      _ary << tmp
    end
    _ary.push(ary[1]).compact
    _ary.compact.reject {|i| (i < range.first) && (i >= range.last) }
  end

  # array = array.map {|s| s.to_time } if opts[:utc]
  # array = array.map {|i| i + opts[:offset] } if opts[:offset]
  array.map(&:to_datetime)
end