2011-12-12 82 views
0

我有一段艱難的「時間」嘗試在Python中使用timedatetime來實現一個相當簡單的目標。我已經與這些模塊合作過,並已閱讀文檔,但我認爲我沒有找到正確的方法。用Python計算數字信號的開始時間和持續時間

我有一個數字信號(長陣列),它表示以給定的採樣速率記錄的時間序列,例如每秒N個樣本。

我有以下格式元組的列表(僞數據):

[(150, 150), 
(450, 90), 
(750, 150), 
(1050, 90), 
(1350, 150), 
(1650, 90), 
... 
(1950, 150)] 

每個元組代表開始的給定時間間隔的樣本的樣品和數量。間隔是連續的,所以起始樣本單調遞增。

我想是來獲取表示間隔(因爲每個樣本具有一個固定的已知的持續時間,通過採樣率所確定的),這樣的開始時間和持續時間字符串:

[('00:12.000', '2.245'), 
('00:15.057', '2.158'), 
('00:18.857', '3.045'), 
etc.] 

(注意:這些值是不是爲了計算,只是爲了給出一個結構和格式化的想法,值是任意鍵入的數字)

我可以想象非常醜陋的方法來得到這與舍入和減法和模除法等,但我認爲Python ,所有那些美麗的時間操縱模塊,必須有pythonic的方式來獲得我所需要的。

有人嗎?

感謝您的閱讀! (並希望未來的答案可能開導其他人在未來的路徑)

+0

你知道,在第二個例子中,這是一個字符串列表而不是元組列表,不是嗎?括號在那裏沒用。 – rubik

+1

你已經試過了什麼?另外,我很難理解我們應該如何計算你列出的第一組元組與你列出的第二組值之間的關係。 –

+0

從兩個列表的第一行開始,看起來150個樣本需要2.245秒,這意味着您的採樣率爲0.015秒。但在第二行中,90個採樣需要2.158秒,這意味着採樣率爲0.024秒。也許這個例子需要修正? – mtrw

回答

1
from datetime import timedelta 

il = [(150, 150), 
     (450, 90), 
     (750, 150), 
     (1050, 90), 
     (1350, 150), 
     (1650, 90), 
     (1950, 150)] 

sr = 12.5 
tl = list(tuple((str(timedelta(seconds=j/sr)) for j in i)) for i in il) 

for t in tl: 
    print(t) 

打印:

('0:00:12', '0:00:12') 
('0:00:36', '0:00:07.200000') 
('0:01:00', '0:00:12') 
('0:01:24', '0:00:07.200000') 
('0:01:48', '0:00:12') 
('0:02:12', '0:00:07.200000') 
('0:02:36', '0:00:12') 

[編輯:取消對輸出數據不匹配評論]

time似乎不支持字符串格式來指定要顯示的字段或小數位數。使用re.match()去掉你不想要的內容,或者將秒轉換爲整型並將其轉換回字符串以獲得固定的dd.ddd格式。

+0

實際上,當我編寫虛擬數據時,我的意思實際上是虛擬的,我只是鍵入隨機值來給出有關輸入組織(2元組列表)和所需輸出(m:ss.sss和s:sss)的一般想法。此外,我實際上需要開始時間分鐘:秒(無小時)和持續時間只有幾秒(沒有小時和沒有分鐘)。 – heltonbiker

+1

'時間'總是給你所有的東西,所以使用字符串操作(切片或重新匹配)來擺脫你不想要的部分。與模算法相比,這很容易。 – Dave

相關問題