আমার একটি ফাংশন রয়েছে যা সেকেন্ডে তথ্য ফিরিয়ে দেয় তবে আমার সেই তথ্যগুলি কয়েক ঘন্টা: মিনিট: সেকেন্ডে সঞ্চয় করতে হবে।
পাইথনে এই ফর্ম্যাটে সেকেন্ডগুলিকে রূপান্তর করার কোনও সহজ উপায় আছে?
আমার একটি ফাংশন রয়েছে যা সেকেন্ডে তথ্য ফিরিয়ে দেয় তবে আমার সেই তথ্যগুলি কয়েক ঘন্টা: মিনিট: সেকেন্ডে সঞ্চয় করতে হবে।
পাইথনে এই ফর্ম্যাটে সেকেন্ডগুলিকে রূপান্তর করার কোনও সহজ উপায় আছে?
উত্তর:
আপনি datetime.timedelta
ফাংশন ব্যবহার করতে পারেন :
>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'
str(datetime.timedelta(seconds=60*60*24+1))
='1 day, 0:00:01'
str(datetime.timedelta(seconds=round(666666.55)))
সঠিকভাবে দিন রেন্ডার; দশমিক সেকেন্ডে দমন করে।
timedelta
ওভারফ্লো নিরাপদ নয় এবং গাণিতিক ক্রিয়াকলাপ সঠিকভাবে সম্পাদন করতে পারে না, যেমন str(timedelta(hours=8) - timedelta(hours=10))
ফলাফল '-1 day, 22:00:00'
এবং পূর্ণসংখ্যার ভিত্তিক সমাধান হ'ল সেই পরিস্থিতিতে যেখানে আপনার প্রয়োজন হয় ঠিক তেমনই '-02:00:00'
।
divmod()
ক্রিয়াকলাপটি ব্যবহার করে যা ভাগফল এবং বাকি উভয়ই উত্পাদন করতে কেবল একটি একক বিভাগ করে, আপনি কেবল দুটি গাণিতিক ক্রিয়াকলাপের সাথে খুব দ্রুত ফলাফল পেতে পারেন:
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
এবং তারপরে ফলাফলটিকে আপনার পছন্দসই আউটপুটে রূপান্তর করতে স্ট্রিং ফর্ম্যাটিং ব্যবহার করুন :
print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
'%d:%02dmn' % (seconds / 60, seconds % 60)
d, h = divmod(h, 24)
।
m, d = divmod(m, 31)
। ওফফ, না, আপনি পারবেন না। আরও খারাপ, লিপ সেকেন্ডের খেলায় আপনার কোডটি ভুল হবে। দীর্ঘ গল্প সংক্ষিপ্ত: ব্যবহার করুন timedelta
এবং ক্যালেন্ডারে গণ্ডগোল করবেন না, এটি আপনাকে কামড় দেবে।
timedelta
লিপ সেকেন্ড নিয়ে কাজ করবে? আমার সন্দেহ নেই। প্রচুর অ্যাপ্লিকেশন রয়েছে যেখানে এই সাধারণ গণিতটি পর্যাপ্ত চেয়ে বেশি।
str(timedelta(hours=8) - timedelta(hours=10))
ফলাফলটি '-1 দিন, 22:00:00' তাই ... আইডিডি যদি এটি লিপ সেকেন্ডের সাথে কাজ করে তবে এটি নেতিবাচক সংখ্যার সাথে কাজ করে না।
আমি খুব সহজেই নামটি দিতে পারি যে একটি সহজ উপায় (কমপক্ষে আমি সিনট্যাক্সটি মনে করতে পারি না) তবে সময় ব্যবহার করা সম্ভব strস্ট্রফটাইম , যা ফর্ম্যাটিংয়ের উপর আরও নিয়ন্ত্রণ দেয়:
from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))
'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'
জিএমটাইমটি সেকেন্ডগুলিকে বিশেষ টিউপল ফর্ম্যাটে রূপান্তর করতে ব্যবহৃত হয় যা strftime()
প্রয়োজন।
দ্রষ্টব্য: 23:59:59 পরে সংক্ষিপ্তসারগুলি
time.strftime('%d %H:%M:%S', time.gmtime(1))
=> '1 দিন, 0:00:01' এর সাথে।
datetime
:':0>8'
বিন্যাস:from datetime import timedelta
"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
':0>8'
বিন্যাস ছাড়াই :"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
time
:from time import gmtime
from time import strftime
# NOTE: The following resets if it goes over 23:59:59!
strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong
"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
without ':0>8':
উদাহরণটিতে একটি {:0>8}
8 টি বাম শূন্যের শূন্য প্যাড অনুপস্থিত ।
time.time()-start
পরিবর্তনশীল বিন্যাস করছি । কোন অন্তর্দৃষ্টি? TypeError: non-empty format string passed to object.__format__
datetime.now()
পরিবর্তে ব্যবহার করার চেষ্টা time.time()
করেছি এবং একই ত্রুটি পেয়েছি।
str()
আপনি এই ধরনের হিসাবে ব্যবহারের একটি বিন্যাসে যাচ্ছি যদি 0>8
: "{:0>8}".format(str(datetime.timedelta(seconds=666777)))
। আরও তথ্যের জন্য এই উত্তরটি পরীক্ষা করুন ।
এটি আমার দ্রুত কৌশল:
from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
আরও তথ্যের জন্য দেখুন: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan
আপনার যদি datetime.time
মূল্য পাওয়ার দরকার হয় তবে আপনি এই কৌশলটি ব্যবহার করতে পারেন:
my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
আপনি যোগ করতে পারবেন না timedelta
করার time
, কিন্তু যোগ করতে পারেন datetime
।
ইউপিডি : একই কৌশলটির আরও একটি ভিন্নতা:
my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
পরিবর্তে 1
আপনি 0 এর চেয়ে বেশি যে কোনও সংখ্যা ব্যবহার করতে পারেন এখানে আমরা এই সত্যটি ব্যবহার করি যা datetime.fromordinal
সর্বদা উপাদান শূন্যের datetime
সাথে প্রত্যাবর্তন করে time
।
এভাবেই পেলাম।
def sec2time(sec, n_msec=3):
''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
if hasattr(sec,'__len__'):
return [sec2time(s) for s in sec]
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if n_msec > 0:
pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
else:
pattern = r'%02d:%02d:%02d'
if d == 0:
return pattern % (h, m, s)
return ('%d days, ' + pattern) % (d, h, m, s)
কিছু উদাহরণ:
$ sec2time(10, 3)
Out: '00:00:10.000'
$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'
$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'
$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']
str(datetime.timedelta(seconds=666))
666.0
এবং 666.1
মানগুলির জন্য ধারাবাহিক স্ট্রিং দৈর্ঘ্য দেয় ।
নিম্নলিখিত সেটটি আমার জন্য কাজ করেছিল।
def sec_to_hours(seconds):
a=str(seconds//3600)
b=str((seconds%3600)//60)
c=str((seconds%3600)%60)
d=["{} hours {} mins {} seconds".format(a, b, c)]
return d
print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']
print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']
dateutil.relativedelta
আপনার যদি ঘন্টা, মিনিট এবং সেকেন্ডের পাশাপাশি ভেসে উঠতে হয় তবে এটি সুবিধাজনক। datetime.timedelta
অনুরূপ ইন্টারফেস সরবরাহ করে না।
from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
int(rt.hours), int(rt.minutes), int(rt.seconds)))
ছাপে
40.0
01:30:40
seconds=5440
পরিবর্তে ব্যবহার করতে চেয়েছিলেন seconds=5540
। আমি আপনার উত্তর পছন্দ, যদিও!
ঘন্টা (এইচ) 3600 (60 মিনিট / ঘন্টা * 60 সেকেন্ড / মিনিট) দ্বারা সেকেন্ডের ফ্লোর বিভাগ (// দ্বারা) দ্বারা গণনা করা হয়
মিনিট (মি) অবশিষ্ট সেকেন্ডের ফ্লোর বিভাগ দ্বারা গণনা করা (ঘন্টা গণনা থেকে অবশিষ্ট%) দ্বারা 60 (60 সেকেন্ড / মিনিট)
একইভাবে, ঘন্টা এবং মিনিট গণনার অবশিষ্টাংশ দ্বারা সেকেন্ড (গুলি)।
বিশ্রামটি কেবল স্ট্রিং ফর্ম্যাটিং!
def hms(seconds):
h = seconds // 3600
m = seconds % 3600 // 60
s = seconds % 3600 % 60
return '{:02d}:{:02d}:{:02d}'.format(h, m, s)
print(hms(7500)) # Should print 02h05m00s
division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes
পিএস আমার কোডটি পেশাগত নয়