使用python将字符串时间戳转换为纪元时间的最快方法是什么?

时间:2012-09-15 12:46:00

标签: python

我需要从像'2012-09-08 12:23:33'那样的字符串时间戳进行大量的对话,这是基于纪元时间的秒。然后我需要在两个时间戳之间得到时间差。我试过两种不同的方式:

date1 = '2012-09-08'
time2 = '12:23:33'
timelist1 = map(int, date1.split('-') + time1.split(':'))

date2 = '2012-09-08'
time2 = '12:23:33'
timelist2 = map(int, date2.split('-') + time2.split(':'))
delta = datetime.datetime(*timelist2) - datetime.datetime(*timelist1)
print delta.seconds

第二种方式是:

date1 = '2012-09-08'
time1 = '12:23:33'
d1 = datetime.datetime.strptime(date1 + ' ' + time1, "%Y-%m-%d %H:%M:%S")
seconds1 = time.mktime(d1.timetuple())
....
seconds2 = time.mktime(d2.timetuple())
print seconds2-deconds1

然而,这两种方式还不够快,因为我有近1亿个动作要做。有什么建议吗?

1 个答案:

答案 0 :(得分:5)

使用datetime.datetime.strptime() function会更好,然后减去两个结果:

import datetime

date1, time1 = '2012-09-08', '12:23:33'
date2, time2 = '2012-09-08', '12:23:33'

dt1 = datetime.datetime.strptime(date1 + ' ' + time1, "%Y-%m-%d %H:%M:%S")
dt2 = datetime.datetime.strptime(date2 + ' ' + time2, "%Y-%m-%d %H:%M:%S")

print (dt1 - dt2).total_seconds()

请注意,datetime.timedelta.seconds只会在几秒钟内为您提供余数,还有一个.days属性。相反,使用.total_seconds()会更加方便,并且您不必考虑.days值。

使用datetime.datetime.strptime()方法加上timedelta方法,可以将大部分工作保留在C代码中,并且应该更快。

请注意,由于解析步骤,这两种方法都不是很快。时间测试:

>>> import timeit
>>> def parse_datetime():
...     date1, time1 = '2012-09-08', '12:23:33'
...     date2, time2 = '2012-09-08', '12:23:33'
...     dt1 = datetime.datetime.strptime(date1 + ' ' + time1, "%Y-%m-%d %H:%M:%S")
...     dt2 = datetime.datetime.strptime(date2 + ' ' + time2, "%Y-%m-%d %H:%M:%S")
...     (dt1 - dt2).total_seconds()
... 
>>> def parse_time():
...     d1 = time.strptime(date1 + ' ' + time1, "%Y-%m-%d %H:%M:%S")
...     d2 = time.strptime(date2 + ' ' + time2, "%Y-%m-%d %H:%M:%S")
...     seconds1 = time.mktime(d1)
...     seconds2 = time.mktime(d2)
...     seconds1 - seconds2
... 
>>> timeit.timeit('test()', 'from __main__ import parse_datetime as test', number=10000)
0.6590030193328857
>>> timeit.timeit('test()', 'from __main__ import parse_time as test', number=10000)
0.7742340564727783

其中第二种方法只使用time.strptime()函数(直接输出一个timetuple)。

虽然没有更快的途径来解析我所知道的日期时间字符串。