Группировка DateTime по произвольному интервалу времени - PullRequest
7 голосов
/ 24 августа 2010

У меня есть 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

и я хочу сгруппировать их в 15-минутный интервал, результат должен выглядеть следующим образом:

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

Интервал предоставляется другим классом, но я могу получить миллисекунды, которые представляют этот интервал (например, Interval.FromMinutes (5) .GetMilliseconds () должен вернуть 300000). Вопрос в том, как мне написать функцию группировки, которая позволяет мне делать что-то вроде этого: data = items.GroupBy(t => GroupingFunction(t.DateTime, interval)) и получать этот результат?

Обновление: интервал не обязательно будет в минутах. Это может быть в часах, минутах или даже днях.

Ответы [ 3 ]

11 голосов
/ 24 августа 2010

Как то так?

        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));
        }
3 голосов
/ 24 августа 2010
 data = items.GroupBy(t => (int)(t.DateTime.Minutes/interval)))
0 голосов
/ 24 августа 2010

Вы пробовали группировать по модулю?

Непроверенный псевдокод потока сознания следует:

data = items.GroupBy(t => t.TimeInterval % 15 == 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...