如何以任意的时间间隔来分组
2017-10-19 21:44 yangtam 阅读(1030) 评论(0) 收藏 举报在实际的项目开发中,我们经常会有这样的需求:按照某些特定条件将一数据集分组,比如按照时间分组、按照任意时间间隔分组。
(一)按照时间分组
这是一种我们在时间项目中接触到最多的情况,在C#中我们可以借助LINQ: group ... by ... into..或Lambda: Group(Func<T,TKey> selector)的方式,来实现对数据分组。如下面代码所示,将时间相同的数据分组:
class Program
{
static void Main(string[] args)
{
DateTime[] dateTimes = new[]
{
new DateTime(2017, 10, 19, 0, 0, 0),
new DateTime(2017, 10, 19, 0, 0, 0),
new DateTime(2017, 10, 19, 0, 15, 0),
new DateTime(2017, 10, 19, 0, 20, 0),
new DateTime(2017, 10, 19, 0, 20, 0),
new DateTime(2017, 10, 19, 0, 30, 0),
new DateTime(2017, 10, 19, 0, 30, 0),
new DateTime(2017, 10, 19, 0, 32, 0),
new DateTime(2017, 10, 19, 0, 32, 0)
};
var groupedTimes = dateTimes
.GroupBy(p => p.Ticks)
.Select(g => new { Begin = new DateTime(g.Key), Values = g.ToList() });
foreach (var value in groupedTimes)
{
Console.WriteLine(value.Begin);
Console.WriteLine("\t{0}", string.Join(", ", value.Values));
}
Console.Read();
}
(二)按照任意时间间隔分组
如何按照任意时间间隔分组呢?比如如何将时间:“2017-8-24 00:05:00”,“2017-8-24 00:10:00”,“2017-8-24 00:15:00”,“2017-8-24 00:20:00”...以15分钟为间隔将数据划分为:
Group1: 2017-8-24 00:00:00
Group2: 2017-8-24 00:15:00
Group3: 2017-8-24 00:30:00
...
通常情况下,我们可以通多减去超出分组时间部分来对数据处理再分组,这里分享一种通过取整的方式来实现对任意时间间隔分组,代码如下所示:
class Program
{
static void Main(string[] args)
{
DateTime[] dateTimes = new[]
{
new DateTime(2017, 8, 24, 0, 5, 0),
new DateTime(2017, 8, 24, 0, 10, 0),
new DateTime(2017, 8, 24, 0, 15, 0),
new DateTime(2017, 8, 24, 0, 20, 0),
new DateTime(2017, 8, 24, 0, 25, 0),
new DateTime(2017, 8, 24, 0, 30, 0),
new DateTime(2017, 8, 24, 0, 31, 0),
new DateTime(2017, 8, 24, 0, 32, 0),
new DateTime(2017, 8, 24, 0, 34, 0),
new DateTime(2017, 8, 24, 0, 36, 0),
new DateTime(2017, 8, 24, 0, 38, 0),
new DateTime(2017, 8, 24, 0, 56, 0),
new DateTime(2017, 8, 24, 1, 07, 0)
};
TimeSpan interval = new TimeSpan(0, 15, 0); // 15 minutes.
var groupedTimes = dateTimes
.GroupBy(p => p.Ticks / interval.Ticks)
.Select(g => new { Begin = new DateTime(g.Key * interval.Ticks), Values = g.ToList() });
foreach (var value in groupedTimes)
{
Console.WriteLine(value.Begin);
Console.WriteLine("\t{0}", string.Join(", ", value.Values));
}
Console.Read();
}
Output:

浙公网安备 33010602011771号