一尘不染

对TimeSeries趋势数据进行重新采样,汇总和插值

sql

在分析能源需求和消耗数据时,我遇到了重新采样和内插时间序列趋势数据的问题。

数据集示例:

timestamp                value kWh
------------------       ---------
12/19/2011 5:43:21 PM    79178
12/19/2011 5:58:21 PM    79179.88
12/19/2011 6:13:21 PM    79182.13
12/19/2011 6:28:21 PM    79183.88
12/19/2011 6:43:21 PM    79185.63

基于这些观察,我希望基于某个时间段汇总一些汇总值,并将该频率设置为一个时间单位。

如图所示,每小时的时间间隔填补了缺失数据的空白

timestamp                value (approx)
------------------       ---------
12/19/2011 5:00:00 PM    79173
12/19/2011 6:00:00 PM    79179
12/19/2011 7:00:00 PM    79186

对于线性算法,似乎我会花费时间上的差并将该值乘以该因子。

TimeSpan ts = current - previous;

Double factor = ts.TotalMinutes / period;

值和时间戳可以基于该因素进行计算。

有了如此大量的可用信息,我不确定为什么很难找到最优雅的方法。

也许首先,有没有可以推荐的开源分析库?

对程序化方法有何建议?理想情况下是C#,或者可能是SQL?

或者,我可以指出任何类似的问题(带有答案)?


阅读 94

收藏
2021-03-17

共1个答案

一尘不染

通过使用内部用于表示DateTime的时间刻度,您可以获得可能的最准确的值。由于这些时间间隔不会在午夜零时重新开始,因此您不会在白天时遇到问题。

// Sample times and full hour
DateTime lastSampleTimeBeforeFullHour = new DateTime(2011, 12, 19, 17, 58, 21);
DateTime firstSampleTimeAfterFullHour = new DateTime(2011, 12, 19, 18, 13, 21);
DateTime fullHour = new DateTime(2011, 12, 19, 18, 00, 00);

// Times as ticks (most accurate time unit)
long t0 = lastSampleTimeBeforeFullHour.Ticks;
long t1 = firstSampleTimeAfterFullHour.Ticks;
long tf = fullHour.Ticks;

// Energy samples
double e0 = 79179.88; // kWh before full hour
double e1 = 79182.13; // kWh after full hour
double ef; // interpolated energy at full hour

ef = e0 + (tf - t0) * (e1 - e0) / (t1 - t0); // ==> 79180.1275 kWh

公式的解释
在几何中,相似的三角形是形状相同但大小不同的三角形。上面的公式基于这样一个事实,即一个三角形中任意两个边的比率对于相似三角形的对应边都是相同的。

如果您有一个三角形ABC和一个相似的三角形abc,那么A : B = a : b。两个比率的相等称为比率。

我们可以将此比例规则应用于我们的问题:

(e1 – e0) / (t1 – t0) = (ef – e0) / (tf – t0)
--- large triangle --   --- small triangle --
2021-03-17