gpt4 book ai didi

python - 从文件中读取时间戳并转换为 ms

转载 作者:行者123 更新时间:2023-11-28 18:48:26 25 4
gpt4 key购买 nike

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

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

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

代码是这样的:

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

感谢任何帮助,因为我真的被困在这里了!谢谢

最佳答案

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

然后,在列表理解中,您将使用 one 时间戳遍历该列表,并制作一个包含 one 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)

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

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)

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

    print(delta.total_seconds() * 1000)

    print(int(delta.total_seconds() * 1000))

关于python - 从文件中读取时间戳并转换为 ms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16940216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com