如何将数据列表分组为年、季、月、周、日

  • 本文关键字:数据 列表 c# linq datetime
  • 更新时间 :
  • 英文 :


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

数据模型非常简单:

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

在获得 ValueData: List<ValueData>年数据的列表后,我需要根据以下内容对数据进行分组: 年份 ==> 包含 4 个季节的数据: 季节 ==> 一个季节包含 4 个月 ==> 一个月包含 4 周的数据 ==> 一周包含基于一年的周日历数字的 7 天数据。因为我需要每年、每个季节、每个月、每周和每天制作一个数据总和

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

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

我相信

你想要一些类似于以下查询的内容:

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);

相关内容

  • 没有找到相关文章

最新更新