LINQ查询以查找时间跨度的最大平均值

时间:2012-01-25 05:12:08

标签: linq

我有一组有两点的数据; “瓦特”和时间戳。

每个数据点间隔1秒。

所以它看起来像这样:

0:01 100
0:02 110
0:03 133
0:04 280

.....

数据集只有几个小时。

我想写一个查询,我可以找到不同时间段(5秒,1分钟,5分钟,20分钟等)的最大平均功率。

我还想知道数据集中的最大平均值发生在哪里。

修改
我想我需要用移动平均线和相应的桶(比如说10秒)进行查询。一旦我得到了这个结果,我就会查询它以找到最大值

3 个答案:

答案 0 :(得分:2)

试试这个(我使用Linqpad,C#语句):

var rnd = new Random();
// Create some data.
var tw = Enumerable.Range(0, 3600)
    .Select(i => Tuple.Create(new TimeSpan(0, 0, i), rnd.Next(1000))).ToList();

// The query.
int secondsPerInterval = 10;
var averages =
tw.GroupBy(t => (int) (t.Item1.TotalSeconds/secondsPerInterval) + 1)
    .Select(g => new
                    {
                        Seconds = g.Key * secondsPerInterval,
                        Avg = g.Average(t => t.Item2)
                    })
    .ToList();

var max = averages.Where(tmp => tmp.Avg == averages.Max(tmp1 => tmp1.Avg)); 
max.Dump();

诀窍是将您的时间跨度按TotalSeconds的整数部分除以所需的间隔长度。

你可以做tw.AsParallel().GroupBy...,但如果你通过并行化开销比你获得的更多,那么你应该进行基准测试。

答案 1 :(得分:1)

好吧,一个在工作的人帮助了我。这是LINQ Pad的答案。

var period = 10;
var rnd = new Random();
// Create some data.
var series = Enumerable.Range(0, 3600)
    .Select(i => Tuple.Create(new TimeSpan(0, 0, i), rnd.Next(300))).ToList();

var item = Enumerable.Range(0, 3600).AsParallel() 
                .Select(i => series.Skip(i).Take(10)) 
                .Select((e, i) => new { Average = e.Sum(x => x.Item2) / e.Count(), Second = i }) 
                .OrderByDescending(a => a.Second).Dump();

                item.First().Dump(); 

答案 2 :(得分:0)

试试这个(未经测试):

for (int i = 0; i < = dataList.count ; i = i + (TimePeriod))
  (from p in dataList.Skip(i).Take(TimePeriod) select p).Average(s => s.Watts)