public void Aggregate(BomRainfallData bomRainfallData)
        {
            if (!bomRainfallData.Validate())
            {
                return;
            }

            var date = bomRainfallData.GetDate();

            if (!_weatherDataByYear.TryGetValue(date.Year, out var dataForYear))
            {
                dataForYear = new WeatherDataForYear()
                {
                    Year = date.Year
                };

                _weatherDataByYear.Add(date.Year, dataForYear);
            }

            AggregateYearData(dataForYear, bomRainfallData);
        }
        private static void AggregateYearData(WeatherDataForYear dataForYear, BomRainfallData bomRainfallData)
        {
            var rainfallReading = new RainfallReading(bomRainfallData.GetDate(), bomRainfallData.GetRainfall());

            if (dataForYear.FirstDate == null || rainfallReading.Date < dataForYear.FirstDate)
            {
                dataForYear.FirstDate = rainfallReading.Date;
            }

            if (dataForYear.LastDate == null || rainfallReading.Date > dataForYear.LastDate)
            {
                dataForYear.LastDate = rainfallReading.Date;
            }

            if (rainfallReading.Rainfall > 0)
            {
                dataForYear.TotalRainfall += rainfallReading.Rainfall;
                dataForYear.DaysWithRainfall++;
            }
            else
            {
                dataForYear.DaysWithNoRainfall++;
            }

            dataForYear.AllReadings.Add(rainfallReading);

            var monthData = dataForYear.MonthlyAggregates.FirstOrDefault(month => month.MonthNumber == rainfallReading.Date.Month);

            if (monthData == null)
            {
                monthData = WeatherDataForMonth.FromDate(rainfallReading.Date);

                dataForYear.MonthlyAggregates.Add(monthData);
            }

            AggregateMonthData(monthData, rainfallReading);
        }