我正在处理多年的大数据。
数据模型非常简单:
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吗?
答案 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);