मैं सेकंड को घंटे, मिनट और सेकंड में कैसे परिवर्तित करूं?


469

मेरे पास एक फ़ंक्शन है जो सेकंड में जानकारी देता है, लेकिन मुझे उस जानकारी को घंटों: मिनट: सेकंड में संग्रहीत करने की आवश्यकता है।

क्या पायथन में इस प्रारूप में सेकंड को बदलने का एक आसान तरीका है?


20

जवाबों:


760

आप datetime.timedeltaफ़ंक्शन का उपयोग कर सकते हैं :

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'

8
यह सबसे अच्छा तरीका है, IMHO, जैसा कि आप तब टाइमडेल्टा और किसी भी डेटाइम वस्तुओं पर अंकगणित का उपयोग कर सकते हैं।
मैथ्यू Schinckel

12
यह कई दिनों के लिए काम करता है: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
सम्मोहन

3
str(datetime.timedelta(seconds=round(666666.55)))सही ढंग से दिन प्रस्तुत करता है; दशमलव सेकंड को दबा देता है।
CPBL

1
timedeltaअतिप्रवाह सुरक्षित नहीं है और गणितीय संचालन को सही ढंग से नहीं कर सकता है, उदाहरण के str(timedelta(hours=8) - timedelta(hours=10))लिए परिणाम है '-1 day, 22:00:00'और पूर्णांक आधारित समाधान उन स्थितियों के लिए है जहां आपको आवश्यकता है '-02:00:00'
cprn

1
+1। इस उत्तर को बहुत आसानी से संशोधित किया जा सकता है। उदाहरण के लिए, यदि आप मुद्रण करते समय किसी फ़ील्ड को छोड़ना चाहते हैं, तो इसका उपयोग करें: stackoverflow.com/questions/7999935/…
eric_kernfeld

614

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+

2
यदि आप फ़ंक्शंस पर ऑपरेटर पसंद करते हैं, तो मोडुलो का उपयोग करें; उदाहरण के लिए (केवल मिनट / सेकंड):'%d:%02dmn' % (seconds / 60, seconds % 60)
ब्यूफ

18
और आप इसे दिनों तक बढ़ा सकते हैं d, h = divmod(h, 24):।
मार्क रैनसम

14
@MarkRansom: और फिर महीनों तक m, d = divmod(m, 31)। Oooops, नहीं, आप नहीं कर सकते। इससे भी बदतर, आपका कोड गलत होगा अगर लीप सेकंड गेम में आते हैं। छोटी कहानी: उपयोग करें timedeltaऔर कैलेंडर के साथ खिलवाड़ न करें, यह आपको काटेगा।

4
@ टिबो timedeltaछलांग सेकंड के साथ सौदा करता है ? मुझे संदेह नहीं है। बहुत सारे अनुप्रयोग हैं जहाँ यह सरल गणित पर्याप्त से अधिक है।
मार्क रैनसम

1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))का परिणाम '-1 दिन, 22:00:00' है ... अगर यह लीप सेकंड के साथ काम करता है, लेकिन यह नकारात्मक संख्याओं के साथ काम नहीं करता है।
18

69

मैं शायद ही नाम दे सकता हूं कि एक आसान तरीका (कम से कम मैं वाक्यविन्यास को याद नहीं कर सकता), लेकिन टाइम.स्ट्रिफ़ाइम का उपयोग करना संभव है , जो स्वरूपण पर अधिक नियंत्रण देता है:

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 के बाद ट्रंकट्स


ठीक है, जवाब वास्तव में यहाँ प्रदान किया गया है - stackoverflow.com/questions/1384406/…
अनातोली टेकटोनिक

13
दुर्भाग्य से यह विधि 1 से दिनों को मापना शुरू कर देती है इसलिए इसे समय डेल्टा का प्रतिनिधित्व करने के लिए डिज़ाइन नहीं किया गया है, और इसलिए यह एक दुर्घटना होने की प्रतीक्षा कर रहा है। उदाहरण के लिए time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1 दिन, 0:00:01' के साथ।
रियाज़ रिज़वी

40

का उपयोग कर 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

1
यह विफल रहता है डेल्टा एक सेकंड से भी कम है:"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
JFS

1
बाकी सभी के without ':0>8':लिए : उदाहरण {:0>8}के लिए बाईं ओर 8 जीरो के लिए एक प्रमुख 0. शून्य पैड गायब है ।
टैंकरस्मैश

2
अजगर 3.5.2 में, मुझे एक टाइपर्र मिलता है। मैं एक time.time()-startचर का प्रारूपण कर रहा हूं । कोई अंतर्दृष्टि? TypeError: non-empty format string passed to object.__format__
मेडले 56

मैंने अपनी समयबद्ध वस्तु को उत्पन्न करने के datetime.now()बजाय उपयोग करने की कोशिश की time.time()और मुझे वही त्रुटि मिली।
मेडली 56

@ medley56 python3 उपयोग करते समय, आप उपयोग करने की जरूरत है str()आप इस तरह के रूप में उपयोग के लिए एक प्रारूप जा रहे हैं 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777)))। अधिक जानकारी के लिए इस उत्तर की जाँच करें
Berriel

21

यह मेरी त्वरित चाल है:

from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'

अधिक जानकारी के लिए देखें: https://humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan


आपको इस बात का कोई अंदाजा नहीं है कि मैं कब तक इसका जवाब ढूंढ रहा था। बहुत बहुत धन्यवाद। मेरी इच्छा है कि मैं आपको +1 से अधिक दे सकूं।
पेप्पा

9

यदि आपको 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


6

यह है कि मैं इसे कैसे मिला।

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']

1
ऊपर दिए गए उत्तर पर इसका क्या लाभ है? str(datetime.timedelta(seconds=666))
रियाज़ रिज़वी

@RiazRizvi माइक्रोसेकंड के लिए 666.0और 666.1मूल्यों के लिए लगातार स्ट्रिंग लंबाई देता है ।
अनातोली टेकटोनिक

6

निम्नलिखित सेट ने मेरे लिए काम किया।

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']

3

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

1
मुझे आपसे अलग आउटपुट मिल रहा है, जो मुझे लगता है कि आपके पास एक टाइपो है। आप शायद seconds=5440इसके बजाय उपयोग करने के लिए थे seconds=5540। मुझे आपका उत्तर पसंद है, हालाँकि!
JL

2

घंटे (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

हालांकि यह कोड ओपी के प्रश्न का हल प्रदान कर सकता है, इसलिए संदर्भ को जोड़ना बेहतर है कि यह क्यों / कैसे काम करता है। यह भविष्य के उपयोगकर्ताओं को सीखने में मदद कर सकता है, और उस ज्ञान को अपने कोड में लागू कर सकता है। जब कोड समझाया जाता है तो आपको उपयोगकर्ताओं से upvotes के रूप में सकारात्मक प्रतिक्रिया मिलने की संभावना होती है।
बोरवम

2
बस किया, धन्यवाद @borchvm को इंगित करने के लिए!
सैम

-2

आप मिनट पाने के लिए सेकंड को 60 से विभाजित कर सकते हैं

import time
seconds = time.time()
minutes = seconds / 60
print(minutes)

जब आप इसे फिर से 60 से विभाजित करते हैं, तो आपको घंटे मिलेंगे


-3

division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes

PS मेरा कोड अनप्रोफेशनल है


2
हे, सवाल hrs में एक प्रारूप के लिए पूछना: मिनट: सेकंड, एक साधारण विभाजन नहीं ..
StupidWolf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.