使用LINQ创建数据间隔

时间:2014-01-21 12:28:11

标签: c# linq grouping average

我在C#中遇到一个问题,我无法弄清楚如何解决:

我有一组由TimeStamp和值组成的数据。 这是一个示例数据集:

<Timestamp>2014-01-06T17:40:08.000Z</TimeStamp>
<Value>200</Value>
<Timestamp>2014-01-06T17:40:09.000Z</TimeStamp>
<Value>234</Value>
<Timestamp>2014-01-06T17:40:11.000Z</TimeStamp>
<Value>214</Value>
<Timestamp>2014-01-06T17:40:12.000Z</TimeStamp>
<Value>264</Value>
<Timestamp>2014-01-06T17:40:13.000Z</TimeStamp>
<Value>300</Value>
<Timestamp>2014-01-06T17:40:15.000Z</TimeStamp>
<Value>276</Value>

我需要做的是以某种方式每30秒获得一次平均值。请注意,数据的记录不一定是每秒。这就是为什么我很难想象如何在没有结果不安全的情况下做到这一点。

这可以通过LINQ声明实现,还是有其他建议?

2 个答案:

答案 0 :(得分:2)

假设您可以弄清楚如何解析XML,并且您拥有一组包含TimeValue的对象。例如,我将使用此集合:

var now = DateTime.Now;
var random = new Random();
var times = Enumerable.Range(1, 10000).Select(i => new
{
    Time = now.AddHours(random .NextDouble()),
    Value = i
});

使用辅助方法DateTime RoundUp(DateTime dt, TimeSpan d)GroupBy

var interval = TimeSpan.FromSeconds(30);
var intervalAverageValues =
    times.GroupBy(t => RoundUp(t.Time, interval))
         .Select(g => new
         {
             AverageValue = g.Average(t => t.Value),
             IntervalEndTime = g.Key,
             Count = g.Count()
         });

答案 1 :(得分:0)

考虑这个伪答案:)

  1. 获取值列表及其时间戳,并生成Tuple<int, int>{}列表,假设您的值为整数。第一个int是索引,第二个int是;
  2. 在填写元组列表时,您需要获取时间戳的总秒数分量并将其除以30.结果应四舍五入到最接近的int
  3. 此时您有一个元组列表,其值与相应的'30秒'组索引配对;
  4. 使用简单的组linq来产生平均值。基本上你循环你的组并总结值。然后除以组的项目数;
  5. 这有点蛮力。我确信有更明智的方法可以做到这一点。