我需要从像'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亿个动作要做。有什么建议吗?
答案 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)。
虽然没有更快的途径来解析我所知道的日期时间字符串。