অজগর দুটি বার বিয়োগ


117

আমি দুই আছে datetime.timeমূল্যবোধ, exitএবং enterআমি ভালো কিছু করতে চাই:

duration = exit - enter

তবে, আমি এই ত্রুটিটি পেয়েছি:

TypeError: এর জন্য অসমর্থিত অপারেন্ড টাইপ (গুলি): 'ডেটটাইম.টাইম' এবং 'ডেটটাইম.টাইম

আমি কীভাবে এটি সঠিকভাবে করব? একটি সম্ভাব্য সমাধান হ'ল timeভেরিয়েবলগুলিকে ভেরিয়েবলগুলিতে রূপান্তর করা datetimeএবং তারপরে বিয়োগফল করা, তবে আমি নিশ্চিত যে আপনার ছেলেরা অবশ্যই আরও ভাল এবং ক্লিনার হতে হবে।

উত্তর:


91

এটা চেষ্টা কর:

from datetime import datetime, date

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

combine একটি ডেটটাইম তৈরি করে, এটি বিয়োগ করা যেতে পারে।


2
@ IgnacioVazquez- আব্রামস পয়েন্টে, এর datetime(1,1,1,0,0,0)পরিবর্তে কেউ বলতে পারেন, বলতে পারেন date.today()
আকাওয়াল

25
একটি নাম না datetime exit, যেহেতু exitএকটি বিল্ট-ইন ফাংশন।
orokusaki

1
পাইথন ২.7 ব্যবহার করে, combineআমার datetimeমডিউলটিতে পদ্ধতি নেই : AttributeError: 'module' object has no attribute 'combine'
এমটোলু

6
mtoloo: datetimeমডিউল আছে এবং এটির datetimeভিতরে একটি অবজেক্ট রয়েছে। ভিতরে বস্তুর combineপদ্ধতি আছে। যদি আপনি কেবল আমদানি করে থাকেন datetime(যেমন import datetime:), তবে আপনাকে পরে যা করা দরকার তা এটি datetime.datetime.combine
গ্রাস্কজি

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:00 এ ঘটলে অপ্রত্যাশিত ফলাফলগুলি আসতে পারে with


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/...
Pushpak Dagade

7

datetime.timeএটি সমর্থন করে না, কারণ সময়টি এভাবে বিয়োগ করা অর্থহীন। datetime.datetimeআপনি যদি এটি করতে চান তবে একটি পূর্ণ ব্যবহার করুন ।


53
যদি আপনি নিজের ডোমেন থেকে জানেন যে দুটি datetime.timeবস্তু aএবং bএকই দিন থেকে এবং সেগুলি হয় b > a, তবে অপারেশনের b - aসঠিক অর্থ রয়েছে।
স্ব্লোগুলি

4
এমনকি যদি তারা একই দিন না হয়, তবুও এটি দুর্দান্ত ধারণা দেয় makes কমপক্ষে যতটা বোধগম্য arctan(0) = (0, pi, 2pi, ...), তবে আমরা কেবল প্রথমটির পরে সেই মানগুলির কোনও যত্ন করি না। সুতরাং, 4:00 - 20:00হয় 8:00এটিও (- 32:00, 56:00, ...) কিন্তু কে রে?
nnot101


7
তদতিরিক্ত, পাইথন এমনকি সামঞ্জস্যপূর্ণ থাকে না। যদি a - b দুটি সময়ের অবজেক্টের জন্য অর্থহীন হয়, তবে এটি কীভাবে এটি> বি বা <বি এটির মতো আচরণ করে? তুলনাটি ইতিমধ্যে একই দিন ধরে নেওয়া হচ্ছে, অন্যথায় এটি সম্পূর্ণরূপে ভাঙা। যেহেতু অনুমানটি তুলনার জন্য তৈরি করা হয়েছে, ততই পার্থক্যমূলক ক্রিয়াকলাপগুলির জন্য একই ধারণাটি সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ।
শন 8

1
এটি অর্থহীন বলার বিষয়টি বিষয়ভিত্তিক, তবে আমি দেখছি আপনি কোথা থেকে এসেছেন। এক সাথে দু'বার যোগ করা আমার কাছে অর্থহীন উপস্থাপনা বলে মনে হয়। আমি মনে করি দুটি সময়ের মানকে বিয়োগ করার সময়সীমাটি ফিরে আসা উচিত। যদি সেই টাইমডেল্টাটি নেতিবাচক হয়ে থাকে, তাই হোন। আমি যা জানতে চাই তা হল পাইথন কেন নতুন সময়ের মান ফেরত দেওয়ার জন্য টাইমডেল্টাকে একটি সময় থেকে যোগ বা বিয়োগ করতে পারে না।
aj.toulan

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

পার্থক্য_ডেল্টা হ'ল আপনার পার্থক্য যা আপনি আপনার কারণে ব্যবহার করতে পারেন।


টাইমডেল্টা অবজেক্টটিকে ডেটটাইমে রূপান্তর করা সম্ভব? মানে আমাদের ডিফারেন্ট_ডেলটা রয়েছে। সেকেন্ডস (), ডেটটাইম বা টাইম অবজেক্টটি ফিরে পাওয়ার কোনও উপায় আছে কি? ধন্যবা
dejdej

হ্যাঁ. datetime.min + delta
সোর্সডেলিকা

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
এখানে আপনি কেবল আসল প্রশ্ন অনুসারে দিনের
তুলনায় পুরো সময়সীমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.