python'da iki kez çıkar


117

iki taneye sahibim datetime.time değerleri, exitve enterben böyle bir şey yapmak istiyorum:

duration = exit - enter

Ancak şu hatayı alıyorum:

TypeError: -: 'datetime.time' ve 'datetime.time için desteklenmeyen işlenen türleri

Bunu nasıl doğru yaparım? Olası bir çözüm, timedeğişkenleri değişkenlere dönüştürmek datetimeve sonra çıkarmaktır , ancak eminim sizler daha iyi ve daha temiz bir yola sahip olmalısınız.

Yanıtlar:


91

Bunu dene:

from datetime import datetime, date

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

combine çıkarılabilen bir tarih saat oluşturur.


2
@ IgnacioVazquez-Abrams'a göre, kişi datetime(1,1,1,0,0,0)yerine kullanılabilir date.today().
Akavall

25
Bir isim vermeyin datetime exit, çünkü exityerleşik bir işlevdir.
orokusaki

1
Python 2.7 kullanarak, ben yok combinebenim yöntemi datetimemodülü: AttributeError: 'module' object has no attribute 'combine'
mtoloo

6
mtoloo: datetimeModül var ve datetimeiçinde bir nesne var. İçindeki nesnenin combineyöntemi var. Sadece içe aktarıyorsanız datetime(böyle :) import datetime, daha sonra yapmanız gereken şey budur datetime.datetime.combine.
gruszczy

1
23: 59: 59: 9999 gibi bir zamanda bu işlevi çağırdığınızda çok nadir bir durum vardır. Bu durumda, date.today() öncesi ve date.today()sonrası farklı bir değer döndürür. Değeri date.today()bir değişkene vermek daha iyi olur .
ramwin

44

kullanın:

from datetime import datetime, date

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

Kullanımı date.minbiraz daha özlü ve gece yarısı bile işe yarıyor.

Bu durum olmayabilir date.today()ilk çağrı 23:59:59 olur ve 00:00:00 sonraki bir eğer beklenmedik sonuçlar döndürebilir.


1
Sana katılıyorum.
ramwin

27

zamanı kullanmak yerine timedelta'yı deneyin:

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)

2
Teşekkürler. Bu çok temiz ve buradaki tüm cevaplardan daha iyi - stackoverflow.com/questions/3096953/…
Pushpak Dagade

7

datetime.timebunu desteklemez, çünkü bu şekilde zamanları çıkarmak neredeyse anlamsızdır. datetime.datetimeBunu yapmak istiyorsanız dolu kullanın .


53
Eğer adınızdan iki biliyorsanız datetime.timenesneleri ave baynı gün olduğunu ve b > adaha sonra operasyon b - amükemmel bir anlamı vardır.
swalog

4
Aynı gün olmasalar bile, yine de mantıklı. En azından mantıklı arctan(0) = (0, pi, 2pi, ...)ama ilkinden sonra bu değerlerin hiçbirini önemsemiyoruz. Yani, 4:00 - 20:00bir 8:00- bu oluyor da ( 32:00, 56:00, ...), ama kim takar?
naught101


7
Dahası, Python tutarlı bile kalmaz. Eğer a - b iki zaman nesnesi için anlamsızsa, o zaman a> b veya a <b nasıl davranır? Karşılaştırma zaten aynı günü varsaymaktadır, aksi takdirde tamamen bozulur. Varsayım karşılaştırma için yapıldığından, fark işlemleri için aynı varsayımı yapmak tamamen tutarlıdır.
Sean

1
Anlamsız demek özneldir, ama nereden geldiğini anlıyorum. İki kere bir araya getirmek benim için anlamsız bir temsil gibi görünüyor. İki zaman değerini çıkarmanın bir timedelta döndürmesi gerektiğini düşünüyorum. Bu zaman dilimi negatif olursa, öyle olsun. Bilmek istediğim şey, python'un yeni bir zaman değeri döndürmek için bir zamandan bir timedelta'yı neden ekleyemediği veya çıkaramadığı.
aj.toulan

7

İki datetime.time nesneniz vardır, bu nedenle datetime.timedetla'yı kullanarak yalnızca iki timedelta oluşturursunuz ve ardından şu anda "-" işleneni kullanarak yaptığınız gibi çıkarırsınız. Aşağıda, tarih saati kullanmadan iki kez çıkarma yapmanın örnek yolu verilmiştir.

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

fark_delta , nedenleriniz için kullanabileceğiniz farkınızdır.


Timedelta nesnesini tekrar datetime dönüştürmek mümkün mü? Demek istediğim, fark_delta .seconds () var, bir tarih saat veya zaman nesnesini geri almanın herhangi bir yolu var mı? Thx
dejdej

Evet. datetime.min + delta
sourcedelica

6

Python timedelta kitaplığı ihtiyacınız olanı yapmalıdır. timedeltaİki datetimeörnek çıkardığınızda A döndürülür .

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

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

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

3

datetime.time yapamazsın - Ama kullanabilirsin datetime.datetime.now()

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

2

Seninle benzer bir durum yaşadım ve sonunda arrow adlı harici kitaplığı kullanmaya başladık .

İşte böyle görünüyor:

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

1
Burada, orijinal soruda olduğu gibi günün zamanlarını değil, tam tarih saat nesnelerini çıkarmayı gösteriyorsunuz
kleptog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.