【问题标题】:Calculate starting time and duration of a digital signal in python在python中计算数字信号的开始时间和持续时间
【发布时间】:2011-12-12 20:26:23
【问题描述】:

我在尝试在 Python 中使用 timedatetime 来实现一个相当简单的目标时遇到了困难。我已经使用过这些模块,并阅读了文档,但我认为我没有得到正确的方法。

我有一个数字信号(一个长数组),它表示以给定采样率记录的时间序列,例如每秒 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 和所有这些漂亮的时间处理模块必须有一种 Python 的方法来得到我需要的东西。

有人吗?

感谢阅读! (并希望即将到来的答案可能会启发其他人未来的道路)

【问题讨论】:

  • 你知道在第二个例子中这是一个字符串列表而不是一个元组列表,不是吗?括号在那里没用。
  • 你已经尝试过什么?另外,我很难理解我们应该如何计算您列出的第一组元组与您列出的第二组值之间的关系。
  • 从两个列表的第一行看来,150 个样本需要 2.245 秒,这意味着您的采样率为 0.015 秒。但在第二行,90 个样本需要 2.158 秒,这意味着采样率为 0.024 秒。也许这个例子需要修复?
  • @MikePennington :实际值没有意义,因为我只是输入了随机数据。只有格式很重要。此外,对我来说,列表或元组也一样。我想要 MM:SS.SSS 格式的开始时间和 SS.SSS 格式的间隔,没有前导零。
  • @mtrw :我考虑过修复这个例子,但这会带来太多的工作,因为我没有代码来做这件事 :o) 。无论如何,我的采样周期大约是 0.01 或 0.001 秒,这并不重要。

标签: python datetime time timestamp string-formatting


【解决方案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() 去除不需要的内容,或将秒转换为int 再转换回字符串以获得固定的dd.ddd 格式。

【讨论】:

  • 实际上,当我编写虚拟数据时,我的意思是实际上是虚拟的,我只是输入随机值来给出关于输入组织(2 元组列表)和所需输出(m:ss.sss 和s:sss)。此外,我实际上需要以分钟为单位的开始时间:秒(不包括小时),而持续时间仅以秒为单位(不包括小时和分钟)。
  • time 总是为您提供全部内容,因此请使用字符串操作(切片或重新匹配)来删除您不想要的部分。与模算术相比,这很容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2014-11-20
  • 1970-01-01
  • 2015-03-13
  • 2017-08-22
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多