代码之家  ›  专栏  ›  技术社区  ›  Fernando

按任意时间间隔分组DateTime

  •  7
  • Fernando  · 技术社区  · 14 年前

    我有一个item类的IEnumerable,定义如下:

    public class Item {
        public DateTime Date { get; private set; }
        public decimal? Value { get; private set; }
    
        public Item(DateTime date, decimal? value) {
         Date = date;
         Value = value;
        }
    }
    

    这些项目在特定的时间间隔内(例如5分钟)。我需要按日期分组,但要改变间隔。例如,如果项目的顺序如下:

    2010-08-24 00:05
    2010-08-24 00:10
    2010-08-24 00:15
    2010-08-24 00:20
    2010-08-24 00:25
    2010-08-24 00:30
    

    2010-08-24 00:15
    2010-08-24 00:30
    

    data = items.GroupBy(t => GroupingFunction(t.DateTime, interval)) 结果呢?

    间隔不一定以分钟为单位。可能是几小时,几分钟甚至几天。

    3 回复  |  直到 14 年前
        1
  •  12
  •   driis    14 年前

    像这样的?

            DateTime[] dateTimes = new[]
                                       {
                                           new DateTime(2010, 8, 24, 0, 5, 0),
                                           new DateTime(2010, 8, 24, 0, 10, 0),
                                           new DateTime(2010, 8, 24, 0, 15, 0),
                                           new DateTime(2010, 8, 24, 0, 20, 0),
                                           new DateTime(2010, 8, 24, 0, 25, 0),
                                           new DateTime(2010, 8, 24, 0, 30, 0)
                                       };
            TimeSpan interval = new TimeSpan(0, 15, 0);     // 15 minutes.
    
            var groupedTimes = from dt in dateTimes
                               group dt by dt.Ticks/interval.Ticks
                               into g
                               select 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));
            }
    
        2
  •  3
  •   James Curran    14 年前
     data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval)))
    
        3
  •  0
  •   Dave Swersky    14 年前

    未经测试的意识流伪代码如下:

    data = items.GroupBy(t => t.TimeInterval % 15 == 0);