繁体   English   中英

TypeError: 不支持的操作数类型 -: 'datetime.time' 和 'datetime.timedelta'

[英]TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.timedelta'

Python datetime不允许从time中减去timedelta 我想这是因为timedelta可以跨越数天,而time仅在 24 小时内(hh:mm:ss.ns)。

现在的问题是,是否有类似于timedelta的数据结构允许直接从time中减法?

我知道我可以将我的datetime.time转换为datetime.timedelta以启用另一个datetime.timedelta的减法。 但是我试图避免将time转换为timedelta ,因为我正在从一个大文件中读取时间,并且每次转换为 timedelta 的成本都很高。 但是,将timedelta简单地替换为some_datastructure (如果存在)并直接从time中减去是一次性操作。

例子:

t1 = datetime.time(hour=1, minute=1, second=1)
# t1 = datetime.timedelta(hours=t1.hour, minutes=t1.minute, seconds=t1.second)
t_diff = datetime.timedelta(hours=0, minutes=0, seconds=1)
print(t1-t_diff)

**ps 我用了多少时间这个词?!

转换为datetime.datetime而不是datetime.timedelta会更有效:

from random import randrange
from datetime import datetime, time, timedelta

# some random times:
N = int(1e6)
ts = [time(randrange(23),randrange(59),randrange(59),randrange(999999)) for _ in range(N)]

# to timedelta could look like
td = [timedelta(0, 0, (t.hour*60*60*1e6+t.minute*60*1e6+t.second*1e6+t.microsecond)) for t in ts]

# %timeit [timedelta(0, 0, (t.hour*60*60*1e6+t.minute*60*1e6+t.second*1e6+t.microsecond)) for t in ts]
# 856 ms ± 903 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

# to datetime could look like
today = datetime.now().date()
dt = [datetime.combine(today, t) for t in ts]

# %timeit [datetime.combine(today, t) for t in ts]
# 201 ms ± 1.85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# now you'd do something with dt
ts_new = [(d + timedelta(seconds=5)).time() for d in dt]

# %timeit [(d + timedelta(seconds=5)).time() for d in dt]
# 586 ms ± 1.68 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

但仍然 - 对于 1M 元素示例,时间表明我们肯定落入了>1ms的临界范围。 如果你想 go 更快,我想你必须首先使用另一种时间格式,例如 integer (微)秒自午夜以来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM