একটি টাইমডেল্টাকে দিন, ঘন্টা এবং মিনিটে রূপান্তর করুন


242

আমি একটি টাইমডেলটা পেয়েছি। আমি তার থেকে দিন, ঘন্টা এবং কয়েক মিনিট চাই - হয় টুপল বা অভিধান হিসাবে ... আমাকে ফস করা হয় না।

আমি কয়েক বছর ধরে কয়েক ডজন ভাষায় এটি অবশ্যই করতে পেরেছি কিন্তু পাইথনের কাছে সাধারণত সমস্ত কিছুর একটি সহজ উত্তর থাকে তাই আমি ভেবেছিলাম যে কিছু অকার্যকর সহজ (এখনও ভার্জোজ) গণিত বের করার আগে আমি এখানে জিজ্ঞাসা করব।

মিঃ ফুজ একটি ভাল বক্তব্য তুলে ধরেছেন।

আমি "তালিকা" (ইবে তালিকার মতো কিছু) নিয়ে কাজ করছি যেখানে প্রত্যেকের একটি সময়কাল থাকে a আমি চেষ্টা করে বাকি সময়টি চেষ্টা করে যাচ্ছিwhen_added + duration - now

আমি কি ঠিক বলছি যে ডিএসটি-র জন্য অ্যাকাউন্ট হবে না? যদি তা না হয় তবে এক ঘন্টা যোগ / বিয়োগ করার সহজ উপায় কী?


যদি তা না হয় শুধু একটি হিসাবে এটি পেতে স্ট্রিং মিমি: এইচ মধ্যে ss ফর্ম্যাটে বলে "0:19:37" থেকে timedeltaবস্তু "datetime.timedelta (সেকেন্ড = 1177)" : কেবল Str ব্যবহার ()
পিটার মর্টেনসেন

উত্তর:


343

আপনি যদি একটি থাকে তাহলে datetime.timedeltaমান td, td.daysইতিমধ্যেই আপনি "দিন" যদি আপনি চান দেয়। timedeltaমানগুলি ভগ্নাংশের-দিনটিকে সেকেন্ড হিসাবে রাখে (সরাসরি ঘন্টা বা মিনিট নয়) সুতরাং আপনাকে অবশ্যই "সাধারণভাবে গণিত" করাতে হবে, যেমন:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

1
মনে রাখবেন যে যদি tdনেতিবাচক হয়, -1 // 3600হয় -1
jcrs


10
///পূর্ণসংখ্যা পেতে পরিবর্তে ব্যবহৃত হয় , ভাসা নয়। //একটি তল বিভাজন অপারেটর: "বিভাগ যা সংখ্যার লাইনের বামে পুরো সংখ্যায় সমন্বয় করে ফলাফল", এখানে দেখুন
এরিক সোভেন পিউডিস্ট

1
@ এরিকসভেনপিউডিস্ট হিসাবে jcrsউল্লেখ -1//3600করা হয়েছে -1, তাই কি তবে ঘণ্টার চেয়ে পিছনে ঘন্টার পরিবর্তে দ্বিতীয় ঘণ্টার int(td.seconds/3600)পরিবর্তে ব্যবহার করবেন না ? -101
সরল ব্যবহারকারী

কীভাবে বাকি সেকেন্ডগুলিকে যুক্ত করবেন? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60এবং তারপরে seconds = x.seconds - hours*3600 - minutes*60
রাফেল 18

73

এটি কিছুটা কমপ্যাক্ট, আপনি দুটি লাইনে ঘন্টা, মিনিট এবং সেকেন্ড পান।

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

7
td.daysশূন্য-না হলে এটি ভুল । আপনি প্রয়োজন hours += td.days*24। আপনি যদি এক সেকেন্ডের ভগ্নাংশ বিবেচনা করতে চান (ওপি না করে); seconds += td.microseconds / 1e6ব্যবহৃত হতে পারে.
jfs

30
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

ডিএসটি হিসাবে, আমি মনে করি সবচেয়ে ভাল বিষয় হ'ল উভয় datetimeবস্তুকে সেকেন্ডে রূপান্তর করা । এই পদ্ধতিটি আপনার জন্য ডিএসটি গণনা করে।

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1
mktime()স্থানীয় সময় অঞ্চল বিভিন্ন সময়ে বিভিন্ন ইউএসসি অফসেট থাকতে পারে ব্যর্থ হতে পারে (অনেক কিছু) - আপনি pytzএকটি পোর্টেবল সনাক্তকারী উপায়ে tz ডাটাবেস অ্যাক্সেস পেতে মডিউল ব্যবহার করতে পারেন । এছাড়াও, স্থানীয় সময় অস্পষ্ট হতে পারে (একটি ত্রুটির 50% সম্ভাবনা) - আপনার কিছুটা অতিরিক্ত তথ্যের প্রয়োজন যেমন উদাহরণস্বরূপ, প্রায়শই (সর্বদা নয়) লগ ফাইলের তারিখগুলি একঘেয়ে থাকে । দেখুন আমি একটি পাইথন তারিখ হইতে একটি দিন বিয়োগ করতে পারেন কিভাবে? যে একই সমস্যা মোকাবেলা করতে হতে পারে।
jfs

7

আমি বুঝতে পারছি না

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

এই সম্পর্কে

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

আপনি একটি ফ্লোট হিসাবে মিনিট কয়েক সেকেন্ড পান।


0

আমি নিম্নলিখিত ব্যবহার:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

-2

টাইমডেল্টসের একটি daysএবং secondsবৈশিষ্ট্য রয়েছে .. আপনি এগুলিকে স্বাচ্ছন্দ্যে রূপান্তর করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.