在python中减法两次

在python中减法两次,python,datetime,timedelta,Python,Datetime,Timedelta,我有两个datetime.time值,exit和enter,我想做如下操作: duration = exit - enter 但是,我得到了这个错误: TypeError:-:“datetime.time”和不支持的操作数类型 “datetime.time 如何正确地执行此操作?一个可能的解决方案是将时间变量转换为日期时间变量,然后再转换为子结构,但我相信你们必须有一个更好更干净的方法。日期时间。时间不支持这一点,因为以这种方式减去时间几乎毫无意义。如果要执行此操作,请使用完整的datetim

我有两个
datetime.time
值,
exit
enter
,我想做如下操作:

duration = exit - enter
但是,我得到了这个错误:

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


如何正确地执行此操作?一个可能的解决方案是将
时间
变量转换为
日期时间
变量,然后再转换为子结构,但我相信你们必须有一个更好更干净的方法。

日期时间。时间
不支持这一点,因为以这种方式减去时间几乎毫无意义。如果要执行此操作,请使用完整的
datetime.datetime

尝试以下操作:

from datetime import datetime, date

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter)

combine
生成可以减去的日期时间。

不要使用时间,请尝试使用时间增量:

import datetime

def diff_times_in_seconds(t1, t2):
    # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1
    h1, m1, s1 = t1.hour, t1.minute, t1.second
    h2, m2, s2 = t2.hour, t2.minute, t2.second
    t1_secs = s1 + 60 * (m1 + 60*h1)
    t2_secs = s2 + 60 * (m2 + 60*h2)
    return( t2_secs - t1_secs)

# using it
diff_times_in_seconds( datetime.datetime.strptime( "13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime( "14:02:39", '%H:%M:%S').time())
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)

我和你们的情况类似,最终使用了一个名为的外部库

下面是它的外观:

导入箭头 >>>enter=arrow.get('12:30:45','HH:mm:ss') >>>exit=arrow.now() >>>持续时间=退出-进入 >>>持续时间 datetime.timedelta(736225143775757451) 使用:

使用
date.min
更为简洁,即使在午夜也能工作

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

python库应该满足您的需要。减去两个
datetime
实例后,将返回
timedelta

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())

您有两个datetime.time对象,因此只需使用datetime.timedetla创建两个timedelta,然后使用“-”操作数进行减法运算。下面是不使用datetime进行两次减法的示例

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

差异\u delta是您的差异,您可以出于自己的原因使用它。

datetime.time
无法做到这一点,但您可以使用
datetime.datetime.now()


timedelta
接受负(-)时间值。所以它可以简单如下(单线)


运行测试

import datetime

enter = datetime.time(hour=1, minute=30)
exit = datetime.time(hour=2, minute=0)
duration = datetime.timedelta(hours=exit.hour-enter.hour, minutes=exit.minute-enter.minute)

>>> duration
datetime.timedelta(seconds=1800)

如果您从域中知道两个
datetime.time
对象
a
b
来自同一天,并且
b>a
,则操作
b-a
具有完美的意义。即使它们不是同一天,也有很好的意义。至少与arctan(0)=(0,pi,2pi,…)
一样有意义,但我们不关心第一个值之后的任何值。所以,
4:00-20:00
8:00
-它也是(
32:00
56:00
,…),但谁在乎呢?此外,Python甚至不保持一致。如果a-b对于两个时间对象来说是无意义的,那么a>b或adatetime(1,1,1,0,0,0,0)而不是
date.today()
。不要命名
datetime
exit
,因为
exit
是一个内置函数。使用python 2.7,我的
datetime
模块中没有
combine
方法:
AttributeError:'module'对象没有属性'combine'
mtoloo:有
datetime
模块,它里面有一个
datetime
对象。里面的对象有
combine
方法。如果您只是导入
datetime
(如下所示:
import datetime
),那么您以后需要做的就是这个
datetime.datetime.combine
。在23:59:9999这样的时间调用此函数的情况非常罕见。在这种情况下,之前的
date.today()
和之后的
date.today()
将返回不同的值。最好将值
date.today()
指定给一个变量。同意您的意见。谢谢。这是非常干净的,比这里所有的答案都好-有可能将timedelta对象转换回datetime吗?我的意思是我们有difference_delta.seconds(),有没有办法返回datetime或time对象?泰克斯
datetime.min+delta
这里您只是演示如何减去完整的datetime对象,而不是原始问题中的时间
start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start
duration = datetime.timedelta(hours=exit.hour-enter.hour, minutes=exit.minute-enter.minute)
import datetime

enter = datetime.time(hour=1, minute=30)
exit = datetime.time(hour=2, minute=0)
duration = datetime.timedelta(hours=exit.hour-enter.hour, minutes=exit.minute-enter.minute)

>>> duration
datetime.timedelta(seconds=1800)