使用linq按小时分组数据并添加下一个日期

时间:2014-11-18 08:49:06

标签: c# linq

我在列表中有一些看起来像这样的数据:

Date , Value
10:00 , 10
10:15 , 25
10:30 , 68
10:45 , 78
11:00 , 33
11:15 , 44
11:30 , 52
11:45 , 19
12:00 , 20
12:15 , 61

现在我想将它们分组:

10:15 , 25
10:30 , 68
10:45 , 78
11:00 , 33

11:15 , 44
11:30 , 52
11:45 , 19
12:00 , 20

显然,我不能简单地按日期使用group.Hour。所以我最终得到了:

for (int z = 1; z < list.Count(); z = z + 4)
{
list.Skip(z).Take(4);

// more code

}

但有时候,我的数据中缺少1/4小时。因此,我的所有分组数据现在都是错误的,因为每个分组都会移动15分钟。

那么,我该如何正确分组数据?

由于

4 个答案:

答案 0 :(得分:0)

为什么你不能按小时分组?您只需要包含日期:

var hourGroups = list.Select(x => new
{
    Element = x,
    Day = x.Date.Date,
    Hour = x.Date.AddMilliseconds(-1).Hour
})
 .GroupBy(x => new{ x.Day, x.Hour });

我减去了一毫秒才能得到你的奇怪分组。

使用部分样本数据进行测试:

var list = new List<Element>() { 
    new Element{Date=new DateTime(2014, 11, 18, 10, 00, 00), Value=10},
    new Element{Date=new DateTime(2014, 11, 18, 10, 15, 00), Value=25},
    new Element{Date=new DateTime(2014, 11, 18, 10, 30, 00), Value=68},
    new Element{Date=new DateTime(2014, 11, 18, 10, 45, 00), Value=78},
    new Element{Date=new DateTime(2014, 11, 18, 11, 00, 00), Value=33},
    new Element{Date=new DateTime(2014, 11, 18, 11, 15, 00), Value=44},
    new Element{Date=new DateTime(2014, 11, 18, 11, 30, 00), Value=52},
};

foreach(var grp in hourGroups)
    Console.WriteLine("Day:{0} Time:{1} Values:{2}",
        grp.Key.Day, grp.Key.Hour, string.Join(",", grp.Select(x => x.Element.Value)));

Output:
Day:18.11.20140 Time:9  Values:10
Day:18.11.2014  Time:10 Values:25,68,78,33
Day:18.11.20140 Time:11 Values:44,52

正如你所看到的,10点钟的第一个元素属于9小时组,似乎是理想的。

如果您希望每个组List<Element>

List<List<Element>> hourGroups = list.Select(x => new
{
    Element = x,
    Day = x.Date.Date,
    Hour = x.Date.AddMilliseconds(-1).Hour
})
 .GroupBy(x => new{ x.Day, x.Hour })
 .Select(g => g.Select(x => x.Element).ToList())
 .ToList();

答案 1 :(得分:0)

我会通过使用TimeSpan变量来做到这一点,这是你减去两个日期时间的地方,我有一个例子如下:

DateTime x = DateTime.now;

bool BeenHour = false;

while(!BeenHour)
{
  DateTime y = DateTime.now
  TimeSpan TimePassed = (x - y);

  if(TimePassed.hours == 1)
  {
    //Do thing
  }
}

答案 2 :(得分:0)

假设您的小时数是季度的倍数,

list.GroupBy(h=> h.AddMinutes(-15).Hour)....

或通常list.GroupBy(h=> h.AddTicks(-1).Hour)....

答案 3 :(得分:0)

datetimes.GroupBy(dt => dt.Minute == 0 ? dt.Hour-1 : dt.Hour)