আমি কীভাবে সেকেন্ডকে ঘন্টা, মিনিট এবং সেকেন্ডে রূপান্তর করব?


469

আমার একটি ফাংশন রয়েছে যা সেকেন্ডে তথ্য ফিরিয়ে দেয় তবে আমার সেই তথ্যগুলি কয়েক ঘন্টা: মিনিট: সেকেন্ডে সঞ্চয় করতে হবে।

পাইথনে এই ফর্ম্যাটে সেকেন্ডগুলিকে রূপান্তর করার কোনও সহজ উপায় আছে?


উত্তর:


760

আপনি datetime.timedeltaফাংশন ব্যবহার করতে পারেন :

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

8
এটি আইএমএইচও, এটিই সর্বোত্তম উপায়, কারণ আপনি টাইমডেল্টা এবং যে কোনও তারিখের সময় অবজেক্টগুলিতে পাটিগণিত ব্যবহার করতে পারেন।
ম্যাথু শিনকেল

12
এটি একাধিক দিনের জন্য কাজ করে: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
হাইপ্রনিক ডেস্ক

3
str(datetime.timedelta(seconds=round(666666.55)))সঠিকভাবে দিন রেন্ডার; দশমিক সেকেন্ডে দমন করে।
সিপিবিএল

1
timedeltaওভারফ্লো নিরাপদ নয় এবং গাণিতিক ক্রিয়াকলাপ সঠিকভাবে সম্পাদন করতে পারে না, যেমন str(timedelta(hours=8) - timedelta(hours=10))ফলাফল '-1 day, 22:00:00'এবং পূর্ণসংখ্যার ভিত্তিক সমাধান হ'ল সেই পরিস্থিতিতে যেখানে আপনার প্রয়োজন হয় ঠিক তেমনই '-02:00:00'
সিআরপিএন

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
@ মার্কারান্সম: এবং তারপরে কয়েক মাস পর পর m, d = divmod(m, 31)। ওফফ, না, আপনি পারবেন না। আরও খারাপ, লিপ সেকেন্ডের খেলায় আপনার কোডটি ভুল হবে। দীর্ঘ গল্প সংক্ষিপ্ত: ব্যবহার করুন timedeltaএবং ক্যালেন্ডারে গণ্ডগোল করবেন না, এটি আপনাকে কামড় দেবে।

4
@ টিবো কি timedeltaলিপ সেকেন্ড নিয়ে কাজ করবে? আমার সন্দেহ নেই। প্রচুর অ্যাপ্লিকেশন রয়েছে যেখানে এই সাধারণ গণিতটি পর্যাপ্ত চেয়ে বেশি।
মার্ক রান্সম

1
@ মার্করানসাম str(timedelta(hours=8) - timedelta(hours=10))ফলাফলটি '-1 দিন, 22:00:00' তাই ... আইডিডি যদি এটি লিপ সেকেন্ডের সাথে কাজ করে তবে এটি নেতিবাচক সংখ্যার সাথে কাজ করে না।
সিআরপিএন

69

আমি খুব সহজেই নামটি দিতে পারি যে একটি সহজ উপায় (কমপক্ষে আমি সিনট্যাক্সটি মনে করতে পারি না) তবে সময় ব্যবহার করা সম্ভব 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 পরে সংক্ষিপ্তসারগুলি


ভাল, তবে উত্তর আসলে এখানে প্রদান করা হয় - stackoverflow.com/questions/1384406/...
আনাতোলি techtonik

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 টি বাম শূন্যের শূন্য প্যাড অনুপস্থিত ।
ট্যানকোরস্যামশ

2
পাইথন ৩.৩.২ তে আমি একটি টাইপরর পেয়েছি। আমি একটি time.time()-startপরিবর্তনশীল বিন্যাস করছি । কোন অন্তর্দৃষ্টি? TypeError: non-empty format string passed to object.__format__
medley56

আমি আমার টাইমডেল্টা অবজেক্ট তৈরি করার datetime.now()পরিবর্তে ব্যবহার করার চেষ্টা time.time()করেছি এবং একই ত্রুটি পেয়েছি।
medley56

@ medley56 Python3 ব্যবহার করার সময়, আপনি ব্যবহার করতে হবে str()আপনি এই ধরনের হিসাবে ব্যবহারের একটি বিন্যাসে যাচ্ছি যদি 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777)))। আরও তথ্যের জন্য এই উত্তরটি পরীক্ষা করুন ।
বেরিল

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

ইউপিডি : একই কৌশলটির আরও একটি ভিন্নতা:

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))
রিয়াজ রিজভী

@ রিয়াজরিজভি মাইক্রোসেকেন্ড 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। আমি আপনার উত্তর পছন্দ, যদিও!
জেএল

2

ঘন্টা (এইচ) 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 আকারে ব্যবহারকারীদের কাছ থেকে ইতিবাচক প্রতিক্রিয়া জানাতে পারেন।
borchvm

2
সবেমাত্র করেছেন, ধন্যবাদ বার্বকভিএমকে নির্দেশ করার জন্য!
স্যাম

-2

মিনিট পেতে আপনি 60 দ্বারা সেকেন্ড ভাগ করতে পারেন

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

আপনি যখন এটিকে আবার 60 দিয়ে ভাগ করবেন তখন আপনি ঘন্টাগুলি পাবেন


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