You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:35:27