【问题标题】:How to group a list of data into year, season, month, week, day?如何将数据列表分组为年、季、月、周、日?
【发布时间】:2018-01-17 08:02:18
【问题描述】:

我正在处理多年的大数据。

数据模型很简单:

public class ValueData
{
    public DateTime TimeRecorded {get; set;}
    public double   ValueRecorded {get; set;}
}

拥有ValueData列表后:List<ValueData>的年份数据,我需要根据:年份==>包含4个季节的数据对数据进行分组:季节==>一个季节包含4个月==>一个月包含 4 周的数据 ==> 一周包含基于一年的周历数的 7 天数据。因为我需要每年、每季、每月、每周和每天汇总数据

如何实现这种数据分类?我应该使用 LinQ 吗?

【问题讨论】:

  • 您可以使用 LINQ,也可以使用不同的方法。然而,你在哪里卡住了?这听起来像是一个需求规范。
  • 我们在谈论多少条记录?
  • @TimSchmelter 我一直在坚持寻找一种方法来根据年、季、月、周和日对数据进行分组。您能想到的另一种方法是什么?
  • @Marcom 大约 2 GB 数据
  • 你在追求var grp = dataList.GroupBy(d => new { Year=d.TimeRecorded.Year, Month=d.TimeRecorded.Month, }).ToList();这样的东西吗?

标签: c# linq datetime


【解决方案1】:

我猜你正在寻找类似conditional groups 的东西 但是 2gbs 的数据需要一段时间来处理。 我想一次性解析并保存结果是可以的,但如果你需要经常运行它,你需要一个更合适的解决方案。

【讨论】:

    【解决方案2】:

    我相信您想要以下查询的内容:

    var groups = data.GroupBy(v => new {Year = v.TimeRecorded.Year,
                                        Season = SeasonFromMonth(v.TimeRecorded.Month),
                                        Month = v.TimeRecorded.Month,
                                        Week = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(v.TimeRecorded, System.Globalization.CalendarWeekRule.FirstDay, System.DayOfWeek.Monday),
                                        Day = v.TimeRecorded.Day});
    

    使用辅助函数SeasonFromMonth,它接受整数月份并返回一些指示季节的值(可能是枚举)。

    然后您可以使用以下查询选择相关子组:

    var fallValues = groups.Where(g => g.Key.Season == Seasons.Fall);
    var decemberValues = groups.Where(g => g.Key.Month == 12);
    var firstOfMonth = groups.Where(g => g.Key.Day == 1);
    

    等等,或者通过添加SelectMany 子句将组扁平化为一个列表(尽管SelectMany 会丢弃关键信息):

    groups.Where(g => g.Key.Season == Seasons.Fall).SelectMany(g => g);
    groups.Where(g => g.Key.Month == 12).SelectMany(g => g);
    groups.Where(g => g.Key.Day == 1).SelectMany(g => g);
    

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2011-09-17
      • 2021-12-17
      相关资源
      最近更新 更多