web-dev-qa-db-fra.com

soustrayez deux fois dans python

J'en ai deux datetime.time valeurs, exit et enter et je veux faire quelque chose comme:

duration = exit - enter

Cependant, j'obtiens cette erreur:

TypeError: type (s) d'opérande non pris en charge pour -: 'datetime.time' et 'datetime.time

Comment puis-je le faire correctement? Une solution possible est de convertir les variables time en variables datetime puis soustructurer, mais je suis sûr que vous devez avoir une méthode plus efficace et plus propre.

97
Chaggster

Essaye ça:

from datetime import datetime, date

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

combine construit un datetime, qui peut être soustrait.

78
gruszczy

Utilisation:

from datetime import datetime, date

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning)

Utiliser date.min Est un peu plus concis et fonctionne même à minuit.

Cela pourrait ne pas être le cas avec date.today() qui pourrait renvoyer des résultats inattendus si le premier appel a lieu à 23:59:59 et le suivant à 00:00:00.

35
alexpirine

au lieu d'utiliser le temps, essayez 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)
17
Edmilson Junior

La bibliothèque python timedelta doit faire ce dont vous avez besoin. Un timedelta est renvoyé lorsque vous soustrayez deux instances datetime.

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

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

datetime.time ne supporte pas cela, car il est presque inutile de soustraire des temps de cette manière. Utilisez un datetime.datetime si vous voulez faire cela.

5
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())
4
jacanterbury

J'ai eu la même situation que vous et j'ai fini par utiliser une bibliothèque externe appelée flèche .

Voici à quoi cela ressemble:

>>> import arrow
>>> enter = arrow.get('12:30:45', 'HH:mm:ss')
>>> exit = arrow.now()
>>> duration = exit - enter
>>> duration
datetime.timedelta(736225, 14377, 757451)
3
rominf

Comme vous avez deux objets datetime.time, il vous suffit pour cela de créer deux timedelta à l'aide de datetime.timedetla, puis de les soustraire comme vous le faites maintenant avec l'opérande "-". Voici un exemple de méthode pour soustraire deux fois sans utiliser 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

difference_delta est votre différence que vous pouvez utiliser pour vos raisons.

2
Hardik Patel

datetime.time Ne peut pas le faire - Mais vous pouvez utiliser datetime.datetime.now()

start = datetime.datetime.now()
sleep(10)
end = datetime.datetime.now()
duration = end - start
0
gies0r