在python中减去两次

Cha*_*ter 103 python datetime

我有两个datetime.time值,exit而且enter我想做的事情如下:

duration = exit - enter
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

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

我该怎么做呢?一种可能的解决方案是将time变量转换为datetime变量,然后转换为子结构,但我相信你们必须有更好更清洁的方法.

gru*_*czy 79

试试这个:

from datetime import datetime, date

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)
Run Code Online (Sandbox Code Playgroud)

combine 建立一个可以减去的日期时间.

  • 不要命名`datetime``exit`,因为`exit`是一个内置函数. (18认同)
  • mtoloo:有`datetime`模块,里面有一个`datetime`对象.里面的对象有`combine`方法.如果你只是导入`datetime`(像这样:`import datetime`),那么你以后需要做的就是`datetime.datetime.combine`. (6认同)
  • 对于@ IgnacioVazquez-Abrams来说,可以使用`datetime(1,1,1,0,0,0)`而不是`date.today()`. (2认同)
  • 当您在某个时间(例如 23:59:59:9999)调用此函数时,这种情况非常罕见。在这种情况下,之前的`date.today()` 和之后的`date.today()` 将返回不同的值。最好给一个变量赋值`date.today()`。 (2认同)

ale*_*ine 39

使用:

from datetime import datetime, date

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)
Run Code Online (Sandbox Code Playgroud)

使用date.min更简洁,即使在午夜也可以使用.

date.today()如果第一次调用发生在23:59:59而下一次调用发生在00:00:00,则可能不会出现意外结果.


小智 19

而不是使用时间尝试timedelta:

from datetime import timedelta

t1 = timedelta(hours=7, minutes=36)
t2 = timedelta(hours=11, minutes=32)
t3 = timedelta(hours=13, minutes=7)
t4 = timedelta(hours=21, minutes=0)

arrival = t2 - t1
lunch = (t3 - t2 - timedelta(hours=1))
departure = t4 - t3

print(arrival, lunch, departure)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这是非常干净的并且比这里的所有答案都更好-/sf/ask/216786741/ (2认同)
  • 请注意,“timedelta”在概念上表示一段时间,而不是一天中的某个时间。 (2认同)

Har*_*tel 9

您有两个 datetime.time 对象,因此您只需使用 datetime.timedetla 创建两个 timedelta,然后像现在一样使用“-”操作数减去。以下是不使用日期时间减去两次的示例方法。

enter = datetime.time(hour=1)  # Example enter time
exit = datetime.time(hour=2)  # Example start time
enter_delta = datetime.timedelta(hours=enter.hour, minutes=enter.minute, seconds=enter.second)
exit_delta = datetime.timedelta(hours=exit.hour, minutes=exit.minute, seconds=exit.second)
difference_delta = exit_delta - enter_delta
Run Code Online (Sandbox Code Playgroud)

difference_delta是您的差异,您可以根据自己的原因使用它。


gie*_*s0r 7

datetime.time不能这样做 - 但你可以使用datetime.datetime.now()

start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 5

datetime.time不支持这一点,因为以这种方式减去时间几乎没有意义.datetime.datetime如果您想这样做,请使用完整版.

  • 如果你从你的域中知道两个`datetime.time`对象`a`和`b`来自同一天,而'b> a`,则操作`b - a`具有完美的含义. (50认同)
  • 即使它们不是同一天,它仍然很有意义.至少和`arctan(0)=(0,pi,2pi,...)`一样有意义,但我们在第一次之后并不关心这些值.所以,`4:00-20:00`是'8:00' - 它也是(`32:00`,`56:00`,......),但是谁在乎呢? (4认同)
  • 此外,Python甚至不保持一致.如果 - b为无意义的两个时间的对象,那么A> B或A <B如何,它相当于它呢?比较已经假定同一天,否则将被彻底打破.由于假设是为了进行比较,因此对差异运算做出相同的假设是完全一致的. (4认同)
  • 说它毫无意义是主观的,但我知道你来自哪里。对我来说,将两次相加似乎是毫无意义的表示。我认为减去两个时间值应该返回一个时间增量。如果该时间增量恰好为负值,那就这样吧。我想知道的是为什么Python不能从时间中添加或减去时间增量来返回新的时间值。 (2认同)

Ben*_*Ben 5

python timedelta库应该可以满足您的需求。timedelta当减去两个datetime实例时,将返回A。

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())
Run Code Online (Sandbox Code Playgroud)