我有一段代码从LabJack和接近传感器接收数据。它以无限循环记录电压值运行,直到用户停止它。
然而,我注意到一些奇怪的地方,我的x轴时间值列表似乎比我的绘图的分辨率显示的数字要多得多。也就是说,我的x轴时间值似乎每隔10毫秒绘制一个点,但我的程序每3.8秒收集5000个数据点,这应该等于一个小于每1毫秒的数据点。
然后我查看了我的数据,我看到了问题。下面是我的x轴值列表中的前几十个数字。
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.00999999999999801, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.020000000000003126, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.030000000000001137, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.03999999999999915, 0.04999999999999716, 0.04999999999999716,... etc.
由于某种原因,代码在将值增加10毫秒并执行相同操作之前,每次重复10次或更多次。下面是记录电压和时间的代码循环。相关行是我定义self.t0
,tcurr
和t
的行。
def startData(self):
print "Starting data collection"
self.t0 = float(datetime.now().strftime('%S.%f')[:-3])
while True:
with self.data_lock:
while not self.data_loop:
ain0bits, = self.d.getFeedback(u3.AIN(0))
tcurr = datetime.now()
volts = self.d.binaryToCalibratedAnalogVoltage(ain0bits, isLowVoltage = False, channelNumber = 0)
t = float(tcurr.strftime('%S.%f')[:-3]) - self.t0 #note, approximate - will be just after voltage was read.
self.tdict.append(t)
self.vdict.append(volts)
self.i += 1
感谢任何帮助!
答案 0 :(得分:0)
看起来你的每个循环都是以低于datetime.datetime的最小分辨率完成的。我编写了简单的脚本来查看是否记录了亚毫秒分辨率。它看起来像是。此外,由于您只是测量已用时间而不需要高级格式化,时区等,使用time.time()
将比datetime
模块提供更好的时间分辨率。
TEST 1
import time
lst1 = list()
BIG_NUM = 10000
for a in range(10):
for a in range(BIG_NUM):
pass
lst1.append(time.time())
TEST 2
import datetime
lst2 = list()
BIG_NUM = 10000
for a in range(10):
for a in range(BIG_NUM):
pass
lst2.append(datetime.datetime.now().strftime('%S.%f')[:-3])
即使BIG_NUM非常小,lst1中记录的时间也在增加,但是在lst2中有重复的条目。但是如果完全删除内部循环,则可能会有一些重复的条目,因为操作的完成时间小于time.time()提供的分辨率
TL; DR:使用time.time()
。如果仍有重复的条目,则内部操作的发生速度快于您可用的最高分辨率时间。