2016-10-12 35 views
0

我有以下的Ruby代碼組JSON數據爲月:返回Rails中通過分組多少數據

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"} 

編輯:我不小心以爲我想要的全部項目最初分組,但我已經編輯了這個問題,因爲我真的想知道,是月份的總天數(因爲有些月份可能沒有所有日期的數據,所以我想知道月份的完整程度)。

數據總是按小時顯示!所以不需要擔心分鐘或秒鐘。

+2

變化'{日期:K,總:v.sum {| d | d ['Total'] .to_i}'到'{Date:k,Total:v.sum {| d | d ['Total']。to_i,Grouped:v.size}' – bjhaid

+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 
    } 
} 
+0

對不起,我不是指物品。我剛剛更新了我的問題。我真正的意思是這個月有多少天被分組。由於我的JSON包含時間,所以你可以每月有1000個。所以計數不會是正確的。對困惑感到抱歉。 – Cameron

+0

@Cameron,在這種情況下,物品的數量是天數,不是?無論如何,這就是我所看到的。試試這個代碼,看看你是否得到預期的結果,並與手動計數進行比較。你會看到它一樣的。 – roychri

+0

不,因爲我可能在不同的時間每天有幾個物體。所以計數將在每個小時而不是每個月的每一天。 – Cameron