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.

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.


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.


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)

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.


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.


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

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 tidak bisa melakukannya - Tapi Anda bisa menggunakan datetime.datetime.now()

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

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)

1
Di sini Anda hanya mendemonstrasikan pengurangan objek datetime lengkap, bukan waktu-hari seperti pada pertanyaan awal
kleptog
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.