为什么datetime.datetime会跳过重复和跳过时间值?

时间:2017-03-01 21:56:32

标签: python python-2.7 datetime

我有一段代码从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.t0tcurrt的行。

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

感谢任何帮助!

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()。如果仍有重复的条目,则内部操作的发生速度快于您可用的最高分辨率时间。