मेरे पास एक फ़ंक्शन है जो सेकंड में जानकारी देता है, लेकिन मुझे उस जानकारी को घंटों: मिनट: सेकंड में संग्रहीत करने की आवश्यकता है।
क्या पायथन में इस प्रारूप में सेकंड को बदलने का एक आसान तरीका है?
मेरे पास एक फ़ंक्शन है जो सेकंड में जानकारी देता है, लेकिन मुझे उस जानकारी को घंटों: मिनट: सेकंड में संग्रहीत करने की आवश्यकता है।
क्या पायथन में इस प्रारूप में सेकंड को बदलने का एक आसान तरीका है?
जवाबों:
आप 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)। Oooops, नहीं, आप नहीं कर सकते। इससे भी बदतर, आपका कोड गलत होगा अगर लीप सेकंड गेम में आते हैं। छोटी कहानी: उपयोग करें timedeltaऔर कैलेंडर के साथ खिलवाड़ न करें, यह आपको काटेगा।
timedeltaछलांग सेकंड के साथ सौदा करता है ? मुझे संदेह नहीं है। बहुत सारे अनुप्रयोग हैं जहाँ यह सरल गणित पर्याप्त से अधिक है।
str(timedelta(hours=8) - timedelta(hours=10))का परिणाम '-1 दिन, 22:00:00' है ... अगर यह लीप सेकंड के साथ काम करता है, लेकिन यह नकारात्मक संख्याओं के साथ काम नहीं करता है।
मैं शायद ही नाम दे सकता हूं कि एक आसान तरीका (कम से कम मैं वाक्यविन्यास को याद नहीं कर सकता), लेकिन टाइम.स्ट्रिफ़ाइम का उपयोग करना संभव है , जो स्वरूपण पर अधिक नियंत्रण देता है:
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'
gmtime का उपयोग सेकंड को विशेष टुपल प्रारूप में बदलने के लिए किया जाता है जिसकी 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 जीरो के लिए एक प्रमुख 0. शून्य पैड गायब है ।
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।
UPD : फिर भी एक ही तकनीक का एक और रूपांतर:
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। मुझे आपका उत्तर पसंद है, हालाँकि!
घंटे (h) 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
PS मेरा कोड अनप्रोफेशनल है