3

我正在尝试用 Python 编写一个程序,它将:

  • 将 .csv 文件作为输入
  • 读取第二行的时间戳
  • 将每个时间戳之间的时间差打印为 ms

当我在变量中写入时间戳时代码有效,但当我尝试使用文件作为输入时没有任何反应。程序运行,但没有任何内容打印到控制台。

这是代码的样子:

import csv
import datetime
from Tkinter import Tk
from tkFileDialog import askopenfilename

Tk().withdraw()
toopen = askopenfilename(filetypes=[("Text file","*.txt")])

with open(toopen, 'rb') as f:
    reader = csv.reader(f, delimiter='\t')
    for row in reader:
        code = row[0]
        times = row[1].split()
        times = [datetime.datetime.strptime(x, "%H:%M:%S.%f") for x in times]
        for i in range(len(times) - 1):
            delta = times[i + 1] - times[i]
            print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds / 1000)

这是我的输入文件的外观示例。

input23 13:13:05.674430
input47 13:13:06.623822
input52 13:13:07.573215
input66 13:13:08.522607

任何帮助表示赞赏,因为我真的被困在这里!谢谢

4

1 回答 1

1

你为什么要拆分row[1]回报?这只是一个时间戳,您正在从中制作一个项目的列表。

然后,在列表理解中,您将使用一个时间戳迭代该列表,并从中创建一个包含一个 datetime实例的列表。

请注意len(times),此时为 1。因此,在执行 时for i in range(len(times) - 1),您实际上是在迭代range(0),这是一个空列表。

你真正想要的是在第一个之外有第二个 for 循环。或者更好的是,用for row in reader:更简单的列表理解替换整个第一个循环,如下所示:

reader = csv.reader(f, delimiter='\t')
times = [datetime.datetime.strptime(timestamp, "%H:%M:%S.%f") for _, timestamp in reader]

for i in range(len(times) - 1):
    delta = times[i + 1] - times[i]
    print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds / 1000)

如果您愿意,您可以for通过替换和索引来改进剩余的循环,方法是通过将列表与自身的版本移动一个位置range()来迭代datetime实例及其后继者对,这可以说是更具可读性和zip()蟒蛇:

reader = csv.reader(f, delimiter='\t')
times = [datetime.datetime.strptime(timestamp, "%H:%M:%S.%f") for _, timestamp in reader]

for time1, time2 in zip(times, times[1:]):
    delta = time2 - time1
    print ((delta.days * 24 * 60 * 60 + delta.seconds) * 1000 + delta.microseconds / 1000)

timedelta正如 JF Sebastian 所指出的,您可以通过使用total_seconds()而不是手动组合所有 3 个组件来更轻松地获得总毫秒数。由于它已经返回了微秒分辨率的结果(它是一个浮点数),因此您只需乘以 1000 即可获得毫秒。如果您想要或不介意小数部分,您就完成了,否则您需要round()和/或转换为int()

    print(delta.total_seconds() * 1000)

或者

    print(int(delta.total_seconds() * 1000))
于 2013-06-05T16:26:48.583 回答