【问题标题】:Figuring out duration of an event in Python在 Python 中计算事件的持续时间
【发布时间】:2010-03-05 17:01:30
【问题描述】:

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

我有两个用于事件开始和结束的时间戳。它们以 UTC 格式存储为 datetime.datetime。我需要做的是弄清楚活动的持续时间。

我尝试从另一个中减去一个,但收到错误:

回溯(最近一次通话最后): 02. 文件 '/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py',第 509 行,在 __call__ 03. handler.post(*groups) 04. 文件“/base/data/home/apps/.../3.340324527833140591/main.py”,第 441 行,在帖子中 05. call_record.Duration = call_record.CallStartTime - call_record.CallEndTime 06. 文件 '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py',第 472 行,在 __set__ 07. 值 = self.validate(值) 08. 文件 '/base/python_lib/versions/1/google/appengine/ext/db/__init__.py',第 2322 行,有效 09. (self.name, self.data_type.__name__)) 10. BadValueError:属性持续时间必须是日期时间 11.

CallStartTime、CallEndTime 和 Duration 都是 GAE 中的 db.DateTimeProperty() 类型。

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

非常感谢任何有关其他信息可能有帮助的建议或指示!

【问题讨论】:

  • 不是那么笨,如果它们真的是 TZ == None,那么减法应该可以工作。你真的很喜欢数学很容易的 POSIX 时间戳。我能找到的唯一功能是 Calendar.timegm。

标签: python google-app-engine


【解决方案1】:

从另一个中减去一个datetime 将得到一个timedelta。如果需要,您可以使用它来创建另一个 datetime,方法是将其添加到另一个 datetime 对象或从另一个 datetime 对象中减去。

但是,如何用单个 datetime 对象表示持续时间?

【讨论】:

  • 以为我做错了什么!我不需要将持续时间存储为日期时间,只是认为它是正确的类型。我真正想要的是已经过去的秒数。我可以从 timedelta 导出它吗?
  • 是的,如果您查看文档 (docs.python.org/library/datetime.html#timedelta-objects),您会看到 timedelta 对象具有 seconds 属性。
【解决方案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)

timedeltas 具有dayssecondsmicroseconds 属性。

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

如果timedelta 跨越几天,那么您也需要几天到几秒:

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

有关timedeltas 的更多信息,请参阅http://docs.python.org/library/datetime.html#timedelta-objects

【讨论】:

    【解决方案3】:

    对于像这样的东西,我总是使用 time.time() 来返回一个漂亮的浮点数,然后主要格式化如下:

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

    这对于快速和肮脏的检查非常有用,但据说还有更好的方法来衡量性能。 90% 的时间这对我来说一直有效。

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2019-07-21
      • 1970-01-01
      • 2013-11-27
      • 2018-03-04
      • 1970-01-01
      • 2019-01-16
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多