EF Core中按日期分组实现气象数据平均值计算
问题描述
开发应用时从第三方API获取JSON结果,反序列化为自定义ViewModel后,需将包含重复日期的记录按dt_txt字段的日期部分分组,计算每日平均温度、风速和湿度,现有代码需完善分组逻辑。
原代码片段:
public async Task<WeatherViewModel?> GetForecast(string param) { var response = JsonConvert.DeserializeObject<WeatherReponseModel>(await httpClientApiService.GetRequestAsync(param, string.Format(WeatherEndPointsUrls.forecast, param))); if (response?.list == null) return null; // 此处需完善分组逻辑 // var orderList = response.list.GroupBy(x => Convert.ToDateTime(x.dt_txt)).ToList(); return new WeatherViewModel(); }
解决方案
1. 新增每日统计ViewModel
首先定义承载每日统计数据的类,以及完善WeatherViewModel结构:
// 存储单天的统计结果 public class DailyWeatherStats { public DateTime Date { get; set; } public double AvgTemperature { get; set; } public double AvgWindSpeed { get; set; } public double AvgHumidity { get; set; } } // 完善后的WeatherViewModel public class WeatherViewModel { public CityViewModel? City { get; set; } public List<DailyWeatherStats>? DailyStats { get; set; } }
2. 实现分组与平均值计算
修改GetForecast方法中的分组逻辑,完成统计计算:
public async Task<WeatherViewModel?> GetForecast(string param) { var response = JsonConvert.DeserializeObject<WeatherReponseModel>(await httpClientApiService.GetRequestAsync(param, string.Format(WeatherEndPointsUrls.forecast, param))); if (response?.list == null) return null; // 按日期分组并计算各项平均值 var dailyStats = response.list .GroupBy(item => item.dt_txt.Date) // 提取日期部分分组,确保同一天的记录归为一组 .Select(group => new DailyWeatherStats { Date = group.Key, AvgTemperature = group.Average(item => item.main.temp), AvgWindSpeed = group.Average(item => item.wind.speed), AvgHumidity = group.Average(item => item.main.humidity) }) .OrderBy(stats => stats.Date) // 按日期排序 .ToList(); return new WeatherViewModel { City = response.city, DailyStats = dailyStats }; }
核心要点
- 分组逻辑:使用
item.dt_txt.Date作为分组键,避免因dt_txt包含具体时间导致同一天的记录被拆分到不同组。 - 平均值计算:利用Linq的
Average()方法直接对分组内的对应字段求平均,简洁高效。 - 排序处理:对统计结果按日期升序排列,保证输出数据的时间顺序性。
内容的提问来源于stack exchange,提问作者Kamran Khan
相关产品推荐
相关产品推荐

