快速将日期时间字符串转换为秒(Python3)

efi*_*efi 3 python performance python-3.x

尝试将大量记录(时间序列)转换为 int ,如下所示:

seconds_time = int(time.mktime(time.strptime(parts[0], '%Y%m%d %H%M%S')))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是代码的瓶颈(耗时约20倍)。有什么建议可以改进它吗?

提前致谢

Jea*_*bre 5

实际上有一种方法可以大大减少解析时间。

import time

start = time.time()

nb_loops = 1000000
time_string = "20170101 201456"
for i in range(nb_loops):
    seconds_time = int(time.mktime(time.strptime(time_string, '%Y%m%d %H%M%S')))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)

第一个循环在 12 秒内运行。我承认不是很好。

但是,由于您的格式很简单,为什么不在列表理解中使用带切片的整数转换(并为缺少的字段添加 0,例如毫秒,...)并将结果传递给mktime.

start = time.time()

for i in range(nb_loops):
    seconds_time = time.mktime(tuple([int(time_string[s:e]) for s,e in ((0,4),(4,6),(6,8),(9,11),(11,13),(13,15))]+[0,0,0]))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)

在 3 秒内运行(保存'%Y%m%d %H%M%S'格式字符串的解析,这似乎需要一段时间)。

使用编译的正则表达式稍微快一点:

import re
r = re.compile("(....)(..)(..) (..)(..)(..)")
start = time.time()

for i in range(nb_loops):
    seconds_time = time.mktime(tuple(map(int,r.match(time_string).groups()))+(0,0,0))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)

结果:

basic 14.41410493850708
string slicing 3.1356000900268555
regex 2.8703999519348145
Run Code Online (Sandbox Code Playgroud)