Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么datetime.datetime跳过重复和跳过时间值?_Python_Python 2.7_Datetime - Fatal编程技术网

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

Python 为什么datetime.datetime跳过重复和跳过时间值?,python,python-2.7,datetime,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.

我有一段代码,从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.0399999999915、0.03999999999915、0.0399999999999915、0.0399999999999915、0.0399999999999915、0.0499999999999716、0.0499999999999716等。

出于某种原因,代码在将每个时间值增加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

非常感谢您的帮助!

看起来您的每个循环都是在小于datetime.datetime的最小分辨率下完成的。我编写了一个简单的脚本,以查看是否记录了亚毫秒分辨率。看起来是这样。另外,因为您只测量所经过的时间,不需要高级格式、时区等,请使用
time.time()
将比
datetime
模块提供更好的时间分辨率

测试1

import time
lst1 = list()
BIG_NUM = 10000
for a in range(10):
    for a in range(BIG_NUM):
        pass
lst1.append(time.time())
测试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:Use
time.time()
。如果仍有重复条目,则内部操作的执行速度将快于您可用的最高分辨率时间。

看起来您的每个循环都是在低于最小分辨率datetime.datetime的情况下完成的。我编写了一个简单的脚本,以查看是否记录了亚毫秒分辨率。看起来是这样的。Also、 由于您只测量经过的时间,不需要高级格式、时区等,因此使用
time.time()
将比
datetime
模块提供更好的时间分辨率

测试1

import time
lst1 = list()
BIG_NUM = 10000
for a in range(10):
    for a in range(BIG_NUM):
        pass
lst1.append(time.time())
测试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()
。如果仍有重复的条目,则其中的操作发生的速度要快于您可用的最高分辨率时间。

您的系统对
datetime.now()的实际分辨率是否超过百分之几秒
?你是说与
vdict
相比,
tdict
中的条目数不同?@user2357112我该如何检查?难道所有计算机都不应该至少具有毫秒分辨率吗?是否有其他Python包可以获得这种时间分辨率?我不需要精确的绝对时间,我需要精确的绝对时间相对时间,就像秒表而不是时钟。@Prophetices是的,
vdict
有来自LabJack数据采集的电压值。这些值看起来很好,不会重复或发生任何事情。@RBuntu:如果您使用的是Python 3,我建议您使用。因为您不是,这可能是您计时的最佳选择。您的系统实际上有
datetime.now()的分辨率超过百分之一秒
?你是说与
vdict
相比,
tdict
中的条目数不同?@user2357112我该如何检查?难道所有计算机都不应该至少具有毫秒分辨率吗?是否有其他Python包可以获得这种时间分辨率?我不需要精确的绝对时间,我需要精确的绝对时间相对时间,就像秒表而不是时钟。@Prophetices是的,
vdict
有来自LabJack数据采集的电压值。这些值看起来很好,它们不会重复或发生任何事情。@RBuntu:如果您使用的是Python 3,我建议您使用。因为您不是,这可能是您计时的最佳选择。我尝试了
时间。time()
由于某种原因,它在第一次尝试时起作用,但从第二次构建开始,它出现了与以前相同的问题。您是获得了低于10ms的分辨率,还是这些值开始仅在1ms以下重复?是的,仅在1ms以下重复。在我的第二次测试中,我遇到了与您类似的问题,尽管我下载了