如何将数据列表分为年,季,月,周,日?

时间:2014-04-07 14:51:10

标签: c# linq datetime

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

数据模型非常简单:

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

在拥有ValueData列表:List<ValueData>多年的数据之后,我需要根据以下内容对数据进行分组:Year ==&gt;包含4个季节的数据:季节==&gt;一个季节包含4个月==&gt;一个月包含4周的数据==&gt;一周包含基于一年的周日历编号的7天的数据。因为我需要每年,每季,每月,每周和每天汇总数据

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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