Python 从文件读取时间戳并转换为ms
我正在尝试用Python编写一个程序,该程序将:Python 从文件读取时间戳并转换为ms,python,datetime,csv,Python,Datetime,Csv,我正在尝试用Python编写一个程序,该程序将: 将.csv文件作为输入 读取第二行中的时间戳 将每个时间戳之间的时间差打印为毫秒 当我在变量中写入时间戳时,代码可以工作,但是当我尝试使用文件作为输入时,什么也没有发生。程序运行,但没有向控制台打印任何内容 下面是代码的外观: import csv import datetime from Tkinter import Tk from tkFileDialog import askopenfilename Tk().withdraw() t
- 将.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
谢谢你的帮助,因为我真的被困在这里了!
谢谢为什么要拆分
行[1]
返回的内容?这只是一个时间戳,您正在从中创建一个项目列表
然后,在列表理解中,您使用one时间戳迭代该列表,并从中创建一个onedatetime
实例列表
请注意,此时的len(times)
为1。因此,当对范围内的i(len(times)-1)执行时,实际上是在范围(0)
上进行迭代,这是一个空列表
实际上,您想要的是在第一个for循环之外有第二个for循环。或者更好的方法是,用更简单的列表理解替换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()
来改进剩余的for
循环,并通过迭代datetime
实例及其后续实例对来改进索引,方法是zip()
将列表本身的版本移动一个位置,这可以说是更具可读性和python性的一点:
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
中更轻松地获得毫秒总数。因为它已经返回了一个微秒分辨率的结果(它是一个浮点),所以只需要乘以1000就可以得到毫秒。如果您想要或不介意小数部分,那么就完成了,否则需要round()
和/或转换为int()
:
或
如果没有打印任何内容,那么您可能打开了一个空文件。我重新检查了文件,遗憾的是,该文件不是问题所在。可能行[1]
中只有一个时间戳,没有空格?如果没有样本输入,这是不可能的。您的代码在其他方面看起来是正确的。为什么要以二进制文件打开该文件?添加了我的输入文件示例。我尝试在没有二进制文件的情况下打开该文件,但没有效果。您可以使用1000*delta.total_seconds()
来获取毫秒。是的,我只是从问题中复制了这一行,没有检查它,因为它与问题无关。但你当然是对的,这是另一个可以改进的部分。@J.F.Sebastian谢谢你的建议,并进行了相应的编辑。谢谢!很好用!您的解释很好地指出了当我看不到错误时我的代码的错误。谢谢
print(delta.total_seconds() * 1000)
print(int(delta.total_seconds() * 1000))