[英]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.NaN
值double.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.