4

我需要从像'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 亿个动作要做。有什么建议吗?

4

1 回答 1

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()函数(直接输出一个时间元组)。

我知道,没有更快的方法来解析日期时间字符串。

于 2012-09-15T12:50:23.457 回答