Tim*_* T. 0 ruby arrays statistics ruby-on-rails time-series
我想创建一个真正的时间序列数组.目前,我使用统计信息宝石来为每个'日'提取值:
define_statistic :sent_count, :count
=> :all, :group => 'DATE(date_sent)',
:filter_on => {:email_id => 'email_id
> = ?'}, :order => 'DATE(date_sent) ASC'
Run Code Online (Sandbox Code Playgroud)
这样做是为了创建一个数组,其中有一个日期值,例如
[["12-20-2010",1], ["12-24-2010",3]]
Run Code Online (Sandbox Code Playgroud)
但是我需要它来填充空值,所以它看起来更像:
[["12-20-2010",1], ["12-21-2010",0], ["12-22-2010",0], ["12-23-2010",0], ["12-24-2010",3]]
Run Code Online (Sandbox Code Playgroud)
请注意第二个示例如何在第一个数组中缺少的日期中具有"0"值.
#!/usr/bin/ruby1.8
require 'date'
require 'pp'
def add_missing_dates(series)
series.map do |date, value|
[Date.strptime(date, '%m-%d-%Y'), value]
end.inject([]) do |series, date_and_value|
filler = if series.empty?
[]
else
((series.last[0]+ 1)..(date_and_value[0] - 1)).map do |date|
[date, 0]
end
end
series + filler + [date_and_value]
end.map do |date, value|
[date.to_s, value]
end
end
a = [["12-20-2010",1], ["12-24-2010",3]]
pp add_missing_dates(a)
# => [["2010-12-20", 1],
# => ["2010-12-21", 0],
# => ["2010-12-22", 0],
# => ["2010-12-23", 0],
# => ["2010-12-24", 3]]
Run Code Online (Sandbox Code Playgroud)
我建议不要使用猴子修补基类来包含这种方法:这不是全部目的; 即使它是,它只是不需要在那里.我会把它放在一个模块中,你可以将它混合到任何需要它的代码中:
module AddMissingDates
def add_missing_dates(series)
...
end
end
class MyClass
include AddMissingDates
...
end
Run Code Online (Sandbox Code Playgroud)
但是,如果你真的想:
def Array.add_missing_dates(series)
...
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |