我在列表中有一些看起来像这样的数据:
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分钟。
那么,我该如何正确分组数据?
由于
答案 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)