在工程领域,经常需要从各种系统中收集大量的测试数据,如压力、温度、电压、电流、速度等。这些数据通常以时间序列的形式被记录,即在特定时间点记录的一组离散数据点。然而,这种时间序列数据对于数学或工程分析来说并不十分有用,这就是直方图发挥作用的地方。时间序列数据可以转换为所谓的时间-水平数据,或者直方图。直方图显示了被检查数据落在特定范围内的次数。通常使用一系列范围或箱来表示整个数据范围。
作为一名工程师,需要将时间序列数据转换为时间-水平数据,因此创建了一个Excel插件来帮助自动化这个任务。市场上有许多商业软件可以快速高效地完成这项任务,但没有预算购买这些软件,而Excel是可用的。
这个解决方案是几年前开发的,并决定将其作为Code Project文章发布,以回应StackOverflow上的一个问题。
本项目的大部分代码是用户界面,用于帮助用户选择要转换的数据,并指定数据应该如何分割。创建用户表单和编程控制它的机制不是本文的主要主题。
上述用户表单允许用户选择多个选项:1通道或2通道数据转换、数据源(文本文件或工作表上的单元格范围)、数据应该排序到的箱数。用户选择数据后,会找到最小值和最大值。然后,用户可以输入将数据排序到的箱数。输入箱数后,会计算并显示箱大小。
要传达的关键信息是将时间序列数据转换为时间-水平数据的代码。PutDataInBins()方法用于该功能,以下代码片段是实际转换发生的地方:
Dim BinNumber0 As Integer
Dim BinNumber1 As Integer
Dim RowNumber As Integer
Dim chanDimension As Integer
For RowNumber = 0 To NumberOfDataLines - 1
BinNumber0 = Int((DataValueList(RowNumber, 0) - MinimumValue(0)) / BinSize(0))
If chanDimension = 2 Then
BinNumber1 = Int((DataValueList(RowNumber, 1) - MinimumValue(1)) / BinSize(1))
Else
BinNumber1 = 0
End If
BinCount(BinNumber0, BinNumber1) = BinCount(BinNumber0, BinNumber1) + 1
Next RowNumber
进行转换的关键计算只有一行代码:
BinNumber0 = Int((DataValueList(RowNumber, 0) - MinimumValue(0)) / BinSize(0))
BinNumber0代表当前数据点应该放置的箱号。DataValueList是当前数据点的值。MinimumValue代表该通道所有数据点的最小值,BinSize是每个箱计算出的大小。这些计算决定了应该为这个数据点增加计数的箱号。
上面用户表单截图中显示的示例使用了随zip文件下载的示例数据文件testdata.txt。这是一通道数据,保存为时间序列数据或顺序数据点。下面显示了这些10000个数据点的图形表示: