kurangi dua kali dengan python

117

Saya memiliki dua datetime.timenilai, exitdan enterdan saya ingin melakukan sesuatu seperti:

duration = exit - enter

Namun, saya mendapatkan kesalahan ini:

TypeError: jenis operan tidak didukung untuk -: 'datetime.time' dan 'datetime.time

Bagaimana cara melakukannya dengan benar? Salah satu solusi yang mungkin adalah mengonversi timevariabel menjadi datetimevariabel dan kemudian substruct, tapi saya yakin kalian pasti memiliki cara yang lebih baik dan lebih bersih.

Chaggster
sumber

Jawaban:

91

Coba ini:

from datetime import datetime, date

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

combine membangun datetime, yang bisa dikurangi.

gruszczy.dll
sumber
2
Untuk poin @ IgnacioVazquez-Abrams, seseorang dapat menggunakan, katakanlah, datetime(1,1,1,0,0,0)alih-alih date.today().
Akavall
25
Jangan beri nama a datetime exit, karena exitmerupakan fungsi bawaan.
orokusaki
1
menggunakan python 2.7, saya tidak memiliki combinemetode dalam datetimemodul saya : AttributeError: 'module' object has no attribute 'combine'
mtoloo
6
mtoloo: Ada datetimemodul dan memiliki datetimeobjek di dalamnya. Objek di dalamnya memiliki combinemetode. Jika Anda hanya mengimpor datetime(seperti ini import datetime:), maka yang perlu Anda lakukan nanti adalah ini datetime.datetime.combine.
gruszczy
1
Ada kasus yang sangat jarang terjadi ketika Anda memanggil fungsi ini pada suatu waktu seperti 23: 59: 59: 9999. Dalam hal ini, date.today() before dan the date.today()later akan mengembalikan nilai yang berbeda. Akan lebih baik jika memberikan nilai date.today()pada variabel.
ramwin
44

Menggunakan:

from datetime import datetime, date

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

Penggunaannya date.minsedikit lebih ringkas dan berfungsi bahkan saat tengah malam.

Ini mungkin tidak terjadi date.today()karena mungkin memberikan hasil yang tidak diharapkan jika panggilan pertama terjadi pada 23:59:59 dan panggilan berikutnya pada 00:00:00.

alexpirine.dll
sumber
1
Setuju dengan Anda.
ramwin
27

daripada menggunakan waktu coba 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)
Edmilson Junior
sumber
2
Terima kasih. Ini sangat bersih dan lebih baik daripada semua jawaban di sini - stackoverflow.com/questions/3096953/…
Pushpak Dagade
7

datetime.timetidak mendukung ini, karena hampir tidak ada artinya mengurangi waktu dengan cara ini. Gunakan penuh datetime.datetimejika Anda ingin melakukan ini.

Ignacio Vazquez-Abrams
sumber
53
Jika Anda tahu dari domain Anda bahwa dua datetime.timeobjek adan bberasal dari hari yang sama, dan itu b > a, maka operasi tersebut b - amemiliki arti yang sempurna.
swalog
4
Bahkan jika mereka bukan pada hari yang sama, itu masih masuk akal. Setidaknya masuk akal arctan(0) = (0, pi, 2pi, ...), tapi kami tidak peduli tentang nilai-nilai itu setelah yang pertama. Jadi, 4:00 - 20:00adalah 8:00- itu juga ( 32:00, 56:00, ...), tapi siapa yang peduli?
n nothing101
7
Selain itu, Python bahkan tidak konsisten. Jika a - b tidak berarti untuk dua objek waktu, lalu bagaimana a> b atau a <b berperilaku seperti itu? Perbandingannya sudah mengasumsikan hari yang sama, jika tidak maka akan rusak total. Karena asumsi dibuat untuk perbandingan, sangat konsisten untuk membuat asumsi yang sama untuk operasi perbedaan.
Sean
1
Mengatakan itu tidak berarti itu subjektif, tetapi saya melihat dari mana Anda berasal. Menambahkan dua kali bersama tampaknya menjadi representasi yang tidak berarti bagi saya. Saya pikir mengurangkan dua nilai waktu akan menghasilkan timedelta. Jika timedelta itu negatif, biarlah. Yang ingin saya ketahui adalah mengapa python tidak dapat menambah atau mengurangi timedelta dari waktu untuk mengembalikan nilai waktu baru.
aj.toulan
7

Anda memiliki dua objek datetime.time jadi untuk itu Anda cukup membuat dua timedelta menggunakan datetime.timedetla dan kemudian mengurangi seperti yang Anda lakukan sekarang menggunakan operand "-". Berikut contoh cara pengurangan dua kali tanpa menggunakan 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

perbedaan_delta adalah perbedaan Anda yang dapat Anda gunakan untuk alasan Anda.

Hardik Patel
sumber
Apakah mungkin untuk mengubah objek timedelta kembali ke datetime? Maksud saya, kita memiliki difference_delta .seconds (), apakah ada cara untuk mendapatkan kembali objek waktu atau waktu? Thx
dejdej
Iya. datetime.min + delta
sourcecedelica
6

Pustaka timedelta python harus melakukan apa yang Anda butuhkan. A timedeltadikembalikan saat Anda mengurangi dua datetimecontoh.

import datetime
dt_started = datetime.datetime.utcnow()

# do some stuff

dt_ended = datetime.datetime.utcnow()
print((dt_ended - dt_started).total_seconds())
Ben
sumber
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())
jacanterbury
sumber
3

datetime.time tidak bisa melakukannya - Tapi Anda bisa menggunakan datetime.datetime.now()

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

Saya memiliki situasi yang sama seperti Anda dan saya berakhir dengan menggunakan perpustakaan eksternal yang disebut panah .

Seperti inilah tampilannya:

>>> import arrow
>>> enter = arrow.get('12:30:45', 'HH:mm:ss')
>>> exit = arrow.now()
>>> duration = exit - enter
>>> duration
datetime.timedelta(736225, 14377, 757451)
rominf
sumber
1
Di sini Anda hanya mendemonstrasikan pengurangan objek datetime lengkap, bukan waktu-hari seperti pada pertanyaan awal
kleptog