2010-03-05 35 views
2

這是一個非常不好的問題,所以我提前致歉!找出Python中事件的持續時間

我有兩個時間戳記事件的開始和結束。它們以UTC格式存儲爲datetime.datetime。我需要做的是弄清事件的持續時間。

我試圖從一箇中減去對方,但收到錯誤:

 
Traceback (most recent call last): 
02. 
File '/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py', line 509, in __call__ 
03. 
handler.post(*groups) 
04. 
File '/base/data/home/apps/.../3.340324527833140591/main.py', line 441, in post 
05. 
call_record.Duration = call_record.CallStartTime - call_record.CallEndTime 
06. 
File '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py', line 472, in __set__ 
07. 
value = self.validate(value) 
08. 
File '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py', line 2322, in validate 
09. 
(self.name, self.data_type.__name__)) 
10. 
BadValueError: Property Duration must be a datetime 
11. 

CallStartTime,CallEndTime和持續時間都在GAE所有db.DateTimeProperty()類型。

我以前使用django timesince來顯示持續時間,但我需要做一些額外的計算來計算出平均值。事件的持續時間。

任何建議或指示什麼額外的信息可能會有所幫助,非常感謝!

+0

不是那種不好意思,如果他們真的是TZ ==那麼減法應該可以工作。你真的很喜歡數學很容易的POSIX時間戳。我能找到的唯一功能就是Calendar.timegm。 – msw 2010-03-05 17:58:40

回答

5

從另一個datetime減去會給你一個timedelta。如果需要,可以使用它創建另一個datetime,方法是將其添加到另一個datetime對象或從其中減去該對象。

但是,如何用單個datetime對象表示持續時間?

+0

以爲我做錯了!我不需要將持續時間存儲爲日期時間,只是認爲它是正確的類型。 我真正想要的是已經過去的秒數。我可以從timedelta中派生嗎? – Sologoub 2010-03-05 17:30:11

+0

是的,如果您查看文檔(http://docs.python.org/library/datetime.html#timedelta-objects),您會看到'timedelta'對象具有'seconds'屬性。 – 2010-03-05 17:36:44

1

2個datetime.datetime對象的差爲datetime.timedelta對象:

In [2]: t1=datetime.datetime.now() 

In [3]: t1 
Out[3]: datetime.datetime(2010, 3, 5, 12, 34, 6, 402507) 

In [4]: t2=datetime.datetime.now() 

In [5]: dt=t2-t1 

In [6]: dt 
Out[6]: datetime.timedelta(0, 8, 911129) 

timedelta■找dayssecondsmicroseconds屬性。

In [7]: dt.seconds 
Out[7]: 8 

如果timedelta跨越天的持續時間,那麼你就需要未來的日子秒太:

In [8]: dt.days*(3600*24)+dt.seconds 
Out[8]: 8 

欲瞭解更多信息一timedelta S,看到http://docs.python.org/library/datetime.html#timedelta-objects

0

對於東西像這樣我總是使用time.time(),給出一個漂亮的浮動,然後大致格式化它像這樣:

import time 

t1 = time.time() 

someLongTakingFunction() 

print "Function took %.2f" % (time.time() - t1) 

這對快速和骯髒的檢查很不錯,但據說有更好的方式來衡量性能。 90%的時間對我來說都是這樣。

相關問題