使用 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 分钟。
那么,我应该怎么做才能正确分组我的数据?
谢谢
为什么不能按小时分组?您只需要包括日期:
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)....