填充时间序列数据



我在列表timeSeries.Records中收到大量时间序列数据。该对象的日期时间属性为(10分钟间隔)TimeStamp和数据值属性Data

时间序列可能有差距,我需要使用适当的日期时间戳和double.NaN的值来粘贴。这将使我能够在UI中的图表中正确显示数据。

我编写了以下代码,但速度非常慢!我怀疑这是因为我正在介绍新对象&在时循环中返回它们。我认为这可以显着优化,也许是完全错误的方法,但不确定从哪里开始...

这是将数据附加到图表的代码:

 foreach (TimeSeriesRecord record in this.FillTimeSeriesGaps(timeSeries))
 {
   dataSeries.Append(record.TimeStamp, record.Data);
 }

填补空白:

 private IEnumerable<TimeSeriesRecord> FillTimeSeriesGaps(ITimeSeriesProvider timeSeries)
    {
        // Get the min & max records by date time
        TimeSeriesRecord minRecord = timeSeries.Records.OrderBy(r => r.TimeStamp).FirstOrDefault();
        TimeSeriesRecord maxRecord = timeSeries.Records.OrderByDescending(r => r.TimeStamp).FirstOrDefault();
        // 10 sec time interval
        TimeSpan seriesIntervalTime = new TimeSpan(0, 10, 0);
        DateTime workingDateTime = minRecord.TimeStamp;
        while (minRecord.TimeStamp <= maxRecord.TimeStamp)
        {
            if (timeSeries.Records.All(r => r.TimeStamp != workingDateTime))
            {
                yield return new TimeSeriesRecord() {TimeStamp = workingDateTime, Data = double.NaN};
            }
            else
            {
                yield return new TimeSeriesRecord()
                {
                    TimeStamp = workingDateTime,
                    Data = (from r in timeSeries.Records
                            where r.TimeStamp == workingDateTime
                            select r.Data).First()
                };
                workingDateTime = workingDateTime.Add(seriesIntervalTime);
            }
        }
    }

对于任何感兴趣的人来说

  private static IEnumerable<TimeSeriesRecord> FillTimeSeriesGaps(ITimeSeriesProvider timeSeries)
    {
        TimeSpan seriesIntervalTime = new TimeSpan(0, 10, 0);
        DateTime previousDateTime = DateTime.MinValue;
        foreach (GenericTimeSeriesRecord record in timeSeries.Records)
        {
            if (previousDateTime == DateTime.MinValue)
            {
                yield return record;
                previousDateTime = record.TimeStamp;
                continue;
            }
            if (previousDateTime + seriesIntervalTime == record.TimeStamp)
            {
                yield return record;
                previousDateTime = record.TimeStamp;
                continue;
            }
            else
            {
                yield return new TimeSeriesRecord() { TimeStamp = previousDateTime + seriesIntervalTime, Data = double.NaN };
                previousDateTime = previousDateTime + seriesIntervalTime;
            }
        }
    }

最新更新