看起来这已经在其他问题中有所涉及,但我仍然对如何真正做到这一点相当困惑。我缺乏经验对这没什么帮助。
我有两个datetime属性-StartTime和EndTime。我从结束时间中减去StartTime得到持续时间。从我的上一个问题(谢谢你所有的答案!)看起来这个操作产生了一个timedelta。
似乎没有一种简单的方法可以直接将timedelta存储在GAE数据存储中,因此这意味着我需要将其转换为in t(毫秒)、float(秒)或time。
我以后还需要做其他的计算,比如计算平均持续时间。基于此,int对我来说似乎是最有意义的。
最好的方法是什么?或者有什么教程我可以玩?
谢谢你!
为了尽可能简单地使用它,有两个步骤:将timedelta转换为int或float,并将其存储在数据存储中。首先,将时间增量转换为微时间:
不过,您不必自己进行转换—您可以定义自定义数据存储属性,该属性允许您将时间增量直接存储到模型:
现在您可以像使用任何其他属性一样使用此属性:
您仍然需要使用时间增量的days、mins、seconds和microseconds属性将增量转换为您选择的时间分辨率。
如果您打算将它存储为
datetime
(我同意这是一个好主意),我将扩展DateTimeProperty
-然后您可以免费获得各种解析和验证。此外,作为
timedelta
存储为datetime
比这里给出的其他方法要容易得多,方法是将其存储为日期时间,与引用日期时间相距一定距离,这样差异表示时间增量。这真的很容易,这要感谢datetime模块给我们的操作符重载。这里有一个NDB API的等价实现,如果您有这种倾向:
准确度
Python中的
timedelta
可以处理大约+/-270万年的三角洲。然而,adatetime
只覆盖了大约10000年的时间范围。要在datetime中存储更大的timedelta,必须进行一些移位并牺牲一些准确性。由于参考日期时间的选择,上面的方法将时间增量限制在这个范围的一半-大约为+/-5000年。
如果你知道你的时间增量总是正的,你可以使用
ref_datetime = datetime.min
(或者如果你知道它总是负的,你可以使用ref_datetime = datetime.max
)来得到大约10000年的完整范围。相关问题 更多 >
编程相关推荐