2017-03-01 104 views
1

我有一段代碼需要從LabJack和接近傳感器獲取數據。它在無限循環記錄電壓值上運行,直到用戶停止。爲什麼datetime.datetime跳過重複和跳過時間值?

不過,我已經注意到一些奇怪的地方我的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,tcurrt的行。

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 

任何幫助表示讚賞!

+3

您的系統是否實際上有比'datetime.now()'釐秒的分辨率嗎? – user2357112

+0

你是說你有'tdict'與'vdict'相比有不同數量的條目嗎? – Prophecies

+0

@ user2357112我該如何檢查?是不是所有的電腦都至少有毫秒級的分辨率?是否有另一個Python包可以讓我獲得那種時間解析?我不需要精確的絕對時間,我需要精確的相對時間,就像秒錶而不是時鐘。 – RBuntu

回答

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()。如果仍然有重複條目,則內部操作發生的速度比可用的最高分辨率時間快。

+0

我用'time.time()'試過這個,出於某種原因,它在第一次嘗試的時候就工作了,但是從第二次開始就有問題,和之前一樣。你是否獲得10ms以下的分辨率,或者是否只在1ms以下開始重複? – RBuntu

+0

是的,只在1ms以下重複。在我的第二個測試中,我遇到了類似的問題,雖然 – Prophecies

+0

我下載了一些名爲「TimerToolV3」的第三方軟件,它位於通知區域,並將系統時鐘分辨率提高到0.5ms。代碼現在可以工作,我只希望有一種方法可以在Python 2.7中實現。 – RBuntu