代码之家  ›  专栏  ›  技术社区  ›  Sologoub

在python中计算事件的持续时间

  •  2
  • Sologoub  · 技术社区  · 15 年前

    这是一个非常正经的问题,所以我提前道歉!

    我有两张活动开始和结束的时间戳。它们以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和duration都是GAE中的db.datetimeproperty()类型。

    我以前用django timesince来显示持续时间,但是我需要做一些额外的计算来计算事件的平均持续时间。

    任何关于额外信息可能有帮助的建议或提示都将受到极大的赞赏!

    3 回复  |  直到 15 年前
        1
  •  5
  •   Will McCutchen    15 年前

    减去一 datetime 别人会给你一个 timedelta . 你可以用它来创建另一个 日期时间 如果你需要加上或减去另一个 日期时间 对象。

    如何用一个 日期时间 对象呢?

        2
  •  1
  •   unutbu    15 年前

    两者的区别 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 days , seconds microseconds 属性。

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

    如果 时间增量 跨越天的持续时间,然后您还需要天到秒:

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

    更多信息 时间增量 S,见 http://docs.python.org/library/datetime.html#timedelta-objects

        3
  •  0
  •   Koen Bok    15 年前

    对于类似的东西,我总是使用time.time(),它返回一个很好的浮点值,然后主要将其格式化如下:

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

    这对于快速和肮脏的检查是很好的,但据说有更好的方法来衡量性能。90%的时间都是这样的。