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

本文关键字:添加 日期 下一个 linq 小时 数据 使用 | 更新日期: 2023-09-27 18:30:58

我在列表中有一些数据,如下所示:

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

显然,我不能简单地按日期.小时使用组。所以我最终得到:

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

但有时,我的数据中缺少 1 刻钟。所以我所有的分组数据现在都是错误的,因为每个分组都移动了 15 分钟。

那么,我应该怎么做才能正确分组我的数据?

谢谢

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

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

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

我会使用 TimeSpan 变量来做到这一点,这是您彼此减去两个日期时间的地方,我在下面举了一个示例:

DateTime x = DateTime.now;
bool BeenHour = false;
while(!BeenHour)
{
  DateTime y = DateTime.now
  TimeSpan TimePassed = (x - y);
  if(TimePassed.hours == 1)
  {
    //Do thing
  }
}
datetimes.GroupBy(dt => dt.Minute == 0 ? dt.Hour-1 : dt.Hour)

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

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

或者一般list.GroupBy(h=> h.AddTicks(-1).Hour)....