2012-09-15 44 views
4

我需要從'2012-09-08 12:23:33'這樣的字符串時間戳進行大量的對話,進入基於時代的時間。然後我需要獲得兩個時間戳之間的時間差。我嘗試了兩次不同的方式:使用python將字符串時間戳轉換爲epoch時間的最快方法是什麼?

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 

然而這兩種方式都不夠快,因爲我有將近100百萬行動do.Any建議嗎?

+0

如果你正在解析按時間排序的日誌或其他數據,那麼我建議你緩存'mktime(strptime())'的結果。如果每分鐘有超過10行,緩存所有內容,但秒數可能非常有效。或者,您可以只緩存日期。 'mktime'和'strptime'函數實在太慢了。 – BatchyX

+0

謝謝,是的,我已經做了緩存,而我在這裏發佈的代碼沒有緩存的情況下誤解。 – cheneydeng

+0

Follow up of http://stackoverflow.com/questions/12399162/faster-way-to-handle-time-string-with-python –

回答

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)。

有沒有更快的途徑來解析日期時間字符串,但我知道。

相關問題