简体   繁体   English

填充时间序列数据?

[英]Padding time series data?

I am receiving large amounts of time series data in a list timeSeries.Records . 我在列表timeSeries.Records收到大量的时间序列数据。 The object has a date time property of (10 minute intervals) TimeStamp and a data value property Data 该对象具有(10分钟间隔) TimeStamp的日期时间属性和数据值属性Data

The time series may have gaps which I need to pad with the appropriate date time stamp and a value of double.NaN . 时间序列可能有间隙,我需要使用适当的日期时间戳和double.NaNdouble.NaN This will allow me to display the data correctly within a chart in the UI. 这将允许我在UI中的图表中正确显示数据。

I have written the following code which works but is incredibly slow! 我写了下面的代码,但是速度非常慢! I suspect this is because I am newing up new objects & returning them in the while loop. 我怀疑这是因为我正在新建对象并在while循环中返回它们。 I assume this can be optimised significantly and maybe is the wrong approach completely but not sure where to start... 我认为这可以显着优化,可能是完全错误的方法,但不知道从哪里开始......

Here's the code which appends the data to the chart: 这是将数据附加到图表的代码:

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

Filling the gaps: 填补空白:

 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);
            }
        }
    }

For anyone who is interested this is how I sped things up: 对于任何有兴趣的人来说,这就是我加快速度的方法:

  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;
            }
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM