अजगर में दो बार घटाना


117

मैं दो है datetime.timeमूल्यों, exitऔर enterऔर मैं की तरह कुछ करना चाहता हूँ:

duration = exit - enter

हालाँकि, मुझे यह त्रुटि मिली:

TypeError: असमर्थित ऑपरेंड प्रकार (ओं) के लिए -: 'datetime.time' और 'datetime.time

मैं इसे सही तरीके से कैसे करूं? एक संभव समाधान timeचर को datetimeचर और फिर घटाव में परिवर्तित कर रहा है, लेकिन मुझे यकीन है कि आप लोगों के पास एक बेहतर और स्वच्छ तरीका होना चाहिए।

जवाबों:


91

इसे इस्तेमाल करे:

from datetime import datetime, date

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

combine डेटाइम बनाता है, जिसे घटाया जा सकता है।


2
@ के बजाय @ IgnacioVazquez-Abrams बिंदु, एक का उपयोग कर सकते हैं, कहते हैं, के datetime(1,1,1,0,0,0)बजाय date.today()
अकवाल

25
एक नाम नहीं है datetime exit, क्योंकि exitएक अंतर्निहित कार्य है।
orokusaki

1
अजगर 2.7 का उपयोग करते हुए, मेरे पास combineअपने datetimeमॉड्यूल में विधि नहीं है : AttributeError: 'module' object has no attribute 'combine'
mtoloo

6
mtoloo: datetimeमॉड्यूल है और इसके datetimeअंदर एक ऑब्जेक्ट है। अंदर की वस्तु में combineविधि है। यदि आप बस आयात कर रहे हैं datetime(जैसे :) import datetime, तो आपको बाद में क्या करने की आवश्यकता है datetime.datetime.combine
gruszczy

1
एक बहुत ही दुर्लभ मामला है जब आप इस समारोह को किसी समय 23: 59: 59: 9999 पर कॉल करते हैं। उस स्थिति में, date.today() पहले और date.today()बाद में एक अलग मूल्य वापस आ जाएगा। date.today()एक वैरिएबल को मूल्य देना बेहतर होगा ।
रामविन

44

उपयोग:

from datetime import datetime, date

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

उपयोग करना date.minथोड़ा अधिक संक्षिप्त है और आधी रात को भी काम करता है।

date.today()यदि पहली कॉल 23:59:59 और अगले 00:00 बजे होती है तो यह अप्रत्याशित परिणाम नहीं हो सकता है।


1
आप से सहमत।
रामविन

27

समय का उपयोग करने के बजाय समयबद्धता का प्रयास करें:

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
धन्यवाद। यह सभी उत्तरों से बहुत साफ और बेहतर है - stackoverflow.com/questions/3096953/…
पुष्पक दगड़े

7

datetime.timeइसका समर्थन नहीं करता है, क्योंकि इस तरह से समय को घटाना व्यर्थ है। datetime.datetimeयदि आप ऐसा करना चाहते हैं तो एक पूर्ण का उपयोग करें।


53
यदि आप अपने डोमेन से जानते हैं कि दो datetime.timeऑब्जेक्ट aऔर bएक ही दिन से हैं, और यह b > a, तो ऑपरेशन b - aका सही अर्थ है।
13

4
भले ही वे एक ही दिन न हों, फिर भी यह ठीक है। कम से कम जितना समझ में आता है arctan(0) = (0, pi, 2pi, ...), लेकिन हम पहले के बाद उन मूल्यों में से किसी के बारे में परवाह नहीं है। तो, 4:00 - 20:00है8:00 यह भी है (- 32:00, 56:00, ...), लेकिन कौन परवाह करता है?
naught101


7
इसके अलावा, पायथन भी सुसंगत नहीं रहता है। यदि एक - बी दो समय की वस्तुओं के लिए अर्थहीन है, तो यह कैसे है कि एक> बी या एक <बी व्यवहार करता है? तुलना पहले से ही एक ही दिन मान रही है, अन्यथा यह पूरी तरह से टूट गया है। चूंकि धारणा तुलना के लिए बनाई गई है, इसलिए यह अंतर संचालन के लिए समान धारणा बनाने के लिए पूरी तरह से सुसंगत है।
सीन 10

1
यह कहना कि यह अर्थहीन है, व्यक्तिपरक है, लेकिन मैं देख रहा हूं कि आप कहां से आ रहे हैं। दो बार एक साथ जोड़ना मुझे एक निरर्थक प्रतिनिधित्व लगता है। मुझे लगता है कि दो समय मूल्यों को घटाकर एक समयसीमा वापस आनी चाहिए। यदि वह समयसीमा ऋणात्मक होती है, तो यह होना चाहिए। मैं जानना चाहता हूं कि अजगर नए समय के मूल्य को वापस करने के लिए एक समय से समयसीमा को जोड़ या घटा नहीं सकता है।
अं। तूलन

7

आपके पास दो डेटाइम.टाइम ऑब्जेक्ट्स हैं ताकि आप केवल डेटाइमटाइमिमेडेटला का उपयोग करके दो टाइमडेलटा बना सकें और फिर "-" ऑपेरैंड का उपयोग करते हुए इसे हटा दें। डेटाइम का उपयोग किए बिना दो बार बदलने का उदाहरण तरीका निम्नलिखित है।

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

अंतर_डेल्टा आपका अंतर है जिसे आप अपने कारणों के लिए उपयोग कर सकते हैं।


क्या टाइमडेल्टा ऑब्जेक्ट को डेटाइम में बदलना संभव है? मेरा मतलब है कि हमारे पास अंतर_डेल्टा। सेकेंड्स () है, क्या डेटाइम या टाइम ऑब्जेक्ट वापस पाने का कोई तरीका है? Thx
dejdej

हाँ। datetime.min + delta
sourcedelica

6

अजगर टाइमडेल्टा लाइब्रेरी को वही करना चाहिए जो आपको चाहिए। timedeltaजब आप दो datetimeउदाहरणों को घटाते हैं, तो A लौटाया जाता है ।

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 यह नहीं कर सकता - लेकिन आप उपयोग कर सकते हैं datetime.datetime.now()

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

2

आपके जैसी ही स्थिति मेरे पास थी और मैं तीर नामक बाहरी पुस्तकालय का उपयोग करके समाप्त हो गया ।

यहां है कि यह कैसा लग रहा है:

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

1
यहाँ आप केवल संपूर्ण डेटाइम वस्तुओं को घटाने का प्रदर्शन कर रहे हैं, दिन के समय की तरह मूल प्रश्न
kleptog
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.