我有以下Ruby代码,它将JSON数据分组为几个月:
data = data.group_by { |d| d['Date'].to_date.strftime('%Y-%m') }
.collect { |k, v| {Date: k, Total: v.sum { |d| d['Total'].to_i }} }
例如,它会改变:
{"Date":"2012-04-01 12:00:00","Total":"50"},
{"Date":"2012-04-01 13:00:00","Total":"50"},
{"Date":"2012-04-02 05:00:00","Total":"100"},
{"Date":"2012-04-02 06:00:00","Total":"100"}
分为:
{"Date":"2012-04","Total":"300"}
但我想知道有多少天被归入新的JSON。
再次在上面的例子中,我想要回复:
{"Date":"2012-04","Total":"300","Days":"2"}
编辑:我不小心以为我想要最初分组的总项目,但是我编辑了这个问题,正如我真正想知道的那样,是按月分组的总天数(因为有些月份可能没有数据)所有的日子所以我想知道这个月有多完整。)
数据总是按小时计算!所以不用担心几分钟或几秒钟。
答案 0 :(得分:1)
知道group_by返回一个散列,其中键被评估来自块的结果,值是枚举中对应于键的元素数组,然后你的收到了| k,v |其中k是月份,v是该月份的项目数组。
您可以使用它来改变您的代码:
data = data.group_by { |d| d['Date'].to_date.strftime('%Y-%m') }
.collect { |k, v| {Date: k, Total: v.sum { |d| d['Total'].to_i }, Grouped: v.count} }
好的,根据您的评论,这是我更新的答案。这段代码有效,但它不是最优雅的。可能有更好的方法来实现这一目标。但我希望无论如何这都可以帮到你。
totals = {}
data2 = data.group_by { |d|
day = d['Date'].to_date.strftime('%Y-%m-%d')
totals[day] ||= 0
totals[day] += 1
d['Date'].to_date.strftime('%Y-%m')
}.collect { |month, values|
{
Date: month,
Total: values.sum { |d| d['Total'].to_i},
Grouped: totals.group_by{|day, v| day.to_date.strftime('%Y-%m')}[month].count
}
}
这会在单独的哈希totals
中跟踪每一天,然后计算特定月份的天数。
days = []
data2 = data.group_by { |d|
day = d['Date'].to_date.strftime('%Y-%m-%d')
days << day
d['Date'].to_date.strftime('%Y-%m')
}.collect { |month, values|
{
Date: month,
Total: values.sum { |d| d['Total'].to_i},
Days: days.uniq.select{|day| day.to_date.strftime('%Y-%m') == month}.count
}
}