我在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声明实现,还是有其他建议?
答案 0 :(得分:2)
假设您可以弄清楚如何解析XML,并且您拥有一组包含Time
和Value
的对象。例如,我将使用此集合:
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)
考虑这个伪答案:)
Tuple<int, int>{}
列表,假设您的值为整数。第一个int是索引,第二个int是值; int
。这有点蛮力。我确信有更明智的方法可以做到这一点。