2017-04-09 1 views
-1

ich group_by bin mit, zur Gruppe energy_delta Spalte jeden Monat, so dass hier das Ergebnis aus dem group_by MethodeZugang erste und das letzte Element in verschachtelten Hash

{ 
    "2017-04-01 00:00:00 UTC": [ 
    { 
     "id": null, 
     "created_at": "2017-04-01T02:14:19.870Z", 
     "energy_delta": 1 
    }, 
    { 
     "id": null, 
     "created_at": "2017-04-01T02:14:19.979Z", 
     "energy_delta": 3 
    }, 
    { 
     "id": null, 
     "created_at": "2017-04-04T15:00:01.136Z", 
     "energy_delta": 10 
    } 
], 
"2017-01-01 00:00:00 UTC": [ 
    { 
     "id": null, 
     "created_at": "2017-01-31T02:14:21.300Z", 
     "energy_delta": 167 
    }, 
    { 
     "id": null, 
     "created_at": "2017-01-31T02:14:21.311Z", 
     "energy_delta": 184 
    }, 
    { 
     "id": null, 
     "created_at": "2017-01-30T02:14:21.322Z", 
     "energy_delta": 200 
    } 
]} 

nun diese verschachtelte Hash Ich habe und ich möchte subtrahieren die letzten energy_delta von der ersten energy_delta für jeden Monat. Wie kann ich das machen?

+0

Haben Sie den letzten Wert oder die Differenz zwischen dem letzten und dem ersten Wert wollen? Sollen die Werte zuerst nach Datum sortiert werden? –

+0

Ja, zuerst wird der Wert nach Datum sortiert, dann wird der Unterschied zwischen dem letzten und dem ersten Wert gefunden –

+0

Okay. Es ist nicht, was die angenommene Antwort tut. –

Antwort

3

Gegeben Sie Ihre Eingabe als Hash in input gespeichert haben, können Sie etwas tun können:

input.collect { |month, entries| { month => entries.first[:energy_delta] - entries.last[:energy_delta] } } 
+0

danke, vielen Dank :) –

0

Wenn Ihre Messwerte bereits nach Datum sortiert sind, können Sie verwenden:

grouped_by_month.each do |month, readings| 
    first_value = readings.first[:energy_delta] 
    last_value = readings.last[:energy_delta] 
    puts month 
    puts last_value - first_value 
end 

Es gibt aus:

2017-04-01 00:00:00 UTC 
9 
2017-01-01 00:00:00 UTC 
33 

Wenn Sie nach Datum sortieren möchten, können Sie verwenden:

grouped_by_month.each do |month, readings| 
    sorted_readings = readings.sort_by{ |reading| reading[:created_at] } 
    first_value = sorted_readings.first[:energy_delta] 
    last_value = sorted_readings.last[:energy_delta] 
    puts month 
    puts last_value - first_value 
end 

Es gibt:

2017-04-01 00:00:00 UTC 
9 
2017-01-01 00:00:00 UTC 
-16 
Verwandte Themen