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.
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.
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.
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)
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())
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.
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())
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)
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.
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