仅通过秒创建一个datetime.time对象

4

我需要将一个整数转换为datetime.time实例。我得到的时间是经过的秒数,因此可能大于59。

我知道可以使用以下方式创建time对象:

import datetime
def to_time(seconds):
    hours = seconds / 3600
    mins = (seconds%3600)/60
    sec = (seconds%3600)%60
    return datetime.time(hours,mins,sec)

如果我有一系列需要转换的时间值,可以将此交给映射函数处理。但我认为这很丑陋。有没有更好的方法呢?

事实上,问题还要更加复杂。我得到一个浮点型的时间值,其中 datetime.date.fromordinal(int(time)) 返回日期,to_time(time - int(time)*86400) 将返回时间。然后我可以将它们组合成我的datetime对象。所以输入的示例可能是734869.00138889,应该得到2013-01-01 00:02。

我肯定希望有一个更简洁的方法。


你能给我们提供 time 的实际值吗? - Martijn Pieters
感谢指出错误。 - MichaelA
这个浮点数值是来自电子表格吗? - Paulo Scardine
不,我的一个同事认为这是个好主意,并使用 python 将其存储在 hdf5 中。我倾向于持不同意见。但是没错,我认为这就是 Excel 方法...。 - MichaelA
2个回答

2

最简单的方法是使用一个datetime.timedelta()对象,将您的time值作为days参数,并将其添加到datetime.datetime.min中; 这将会多出一天,因此您需要从该值中减去1:

from datetime import datetime, timedelta

dt = datetime.min + timedelta(days=time - 1)

这样做可以避免将值转换为整数用于序数,然后只使用小数部分来表示时间。
演示:
>>> from datetime import datetime, timedelta
>>> t = 734869.00138889
>>> datetime.min + timedelta(days=t - 1)
datetime.datetime(2013, 1, 1, 0, 2, 0, 93)

在这种情况下,“days =”是可选的。 - Paulo Scardine
@PauloScardine:显式优于隐式;这样你就不必再查找默认参数是什么了。 - Martijn Pieters
这是一个更好的解决方案。谢谢! - MichaelA

1

我不确定我是否正确理解了如何将小数点后的数字转换为秒,但我会尝试以下方法:

def to_datetime(time):
    return datetime.datetime.fromordinal(int(time)) + \
           datetime.timedelta(time % 1)

[更新]

这是您想要的结果吗?

>>> to_datetime(734869.00138889)
datetime.datetime(2013, 1, 1, 0, 2, 0, 93)

你可以使用 days=time % 1 - Martijn Pieters
如果您想要添加一个 timedelta() 并使其正常工作,您还需要使用 datetime.datetime() - Martijn Pieters
很遗憾,这对我来说不起作用 - 第一个对象的类型是datetime.date,并且不关心timedelta < 1天 :( 编辑:成功了!使用datetime.datetime它可以工作,我不知道datetime也有fromordinal可用...。 - MichaelA
无论如何也无法在Python标签上击败Martijn。 :-) - Paulo Scardine
是的,我只在这里待了几天,但我已经意识到他非常快速和能干。这正是我期望的结果。谢谢! - MichaelA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接