HoppingWindow的alignment
用HoppingWindow分析数据的时候,如果用下面的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var newSourceData = new []
{
new { S=DateTime.Parse("2009-10-23 17:00:00.0000000"),E=DateTime.Parse("2009-10-23 18:10:00.0000000"),V=12},
new { S=DateTime.Parse("2009-10-23 18:10:00.0000000"),E=DateTime.Parse("2009-10-23 19:12:00.0000000"),V=27},
new { S=DateTime.Parse("2009-10-23 19:12:00.0000000"),E=DateTime.Parse("2009-10-23 20:13:00.0000000"),V=29}
};
var myInputStream = newSourceData.ToIntervalStream(Application,ev => IntervalEvent.CreateInsert(ev.S.ToLocalTime(),ev.E.ToLocalTime(),ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);
var myStream = from win in myInputStream.HoppingWindow(
TimeSpan.FromTicks(1), TimeSpan.FromHours(2),
HoppingWindowOutputPolicy.ClipToWindowEnd)
select new
{
// 窗口仅用来显示每2小时候的一个事件点
CountSoFar = win.Sum(e => e.V)
};
myStream.Dump();
{
new { S=DateTime.Parse("2009-10-23 17:00:00.0000000"),E=DateTime.Parse("2009-10-23 18:10:00.0000000"),V=12},
new { S=DateTime.Parse("2009-10-23 18:10:00.0000000"),E=DateTime.Parse("2009-10-23 19:12:00.0000000"),V=27},
new { S=DateTime.Parse("2009-10-23 19:12:00.0000000"),E=DateTime.Parse("2009-10-23 20:13:00.0000000"),V=29}
};
var myInputStream = newSourceData.ToIntervalStream(Application,ev => IntervalEvent.CreateInsert(ev.S.ToLocalTime(),ev.E.ToLocalTime(),ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);
var myStream = from win in myInputStream.HoppingWindow(
TimeSpan.FromTicks(1), TimeSpan.FromHours(2),
HoppingWindowOutputPolicy.ClipToWindowEnd)
select new
{
// 窗口仅用来显示每2小时候的一个事件点
CountSoFar = win.Sum(e => e.V)
};
myStream.Dump();
得到的数据如下:
根据hoppingWindow的特点,这里应该是从2009/10/23 17:00开始,但是为什么这里会是2009/10/23 18:00 呢,
这是因为如果不指定默认的alignment时间,默认的值是UTC的DateTime.MinValue,依照这个值进行对齐就会
和2009/10/23 17:00相差一个小时,然后根据算法,向前偏移HopSize大小就是2009/10/23 18:00 。
将代码改成这样:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var newSourceData = new []
{
new { S=DateTime.Parse("2009-10-23 17:00:00.0000000"),E=DateTime.Parse("2009-10-23 18:10:00.0000000"),V=12},
new { S=DateTime.Parse("2009-10-23 18:10:00.0000000"),E=DateTime.Parse("2009-10-23 19:12:00.0000000"),V=27},
new { S=DateTime.Parse("2009-10-23 19:12:00.0000000"),E=DateTime.Parse("2009-10-23 20:13:00.0000000"),V=29}
};
var myInputStream = newSourceData.ToIntervalStream(Application,ev => IntervalEvent.CreateInsert(ev.S.ToLocalTime(),ev.E.ToLocalTime(),ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);
var myStream = from win in myInputStream.HoppingWindow(
TimeSpan.FromTicks(1), TimeSpan.FromHours(2),
DateTime.Parse("2009-10-23 17:00:00.0000000").ToUniversalTime(),
HoppingWindowOutputPolicy.ClipToWindowEnd)
select new
{
// 窗口仅用来显示每2小时候的一个事件点
CountSoFar = win.Sum(e => e.V)
};
myStream.Dump();
{
new { S=DateTime.Parse("2009-10-23 17:00:00.0000000"),E=DateTime.Parse("2009-10-23 18:10:00.0000000"),V=12},
new { S=DateTime.Parse("2009-10-23 18:10:00.0000000"),E=DateTime.Parse("2009-10-23 19:12:00.0000000"),V=27},
new { S=DateTime.Parse("2009-10-23 19:12:00.0000000"),E=DateTime.Parse("2009-10-23 20:13:00.0000000"),V=29}
};
var myInputStream = newSourceData.ToIntervalStream(Application,ev => IntervalEvent.CreateInsert(ev.S.ToLocalTime(),ev.E.ToLocalTime(),ev),AdvanceTimeSettings.StrictlyIncreasingStartTime);
var myStream = from win in myInputStream.HoppingWindow(
TimeSpan.FromTicks(1), TimeSpan.FromHours(2),
DateTime.Parse("2009-10-23 17:00:00.0000000").ToUniversalTime(),
HoppingWindowOutputPolicy.ClipToWindowEnd)
select new
{
// 窗口仅用来显示每2小时候的一个事件点
CountSoFar = win.Sum(e => e.V)
};
myStream.Dump();
结果就会是期望的结果了: