How convert seconds in minutes and seconds (mm:ss) - python

Is it possible to convert seconds into minutes and seconds with this format "mm:ss"?
I try to use datetime.timedelta(seconds=seconds) but it returns hh:mm:ss format.
Thanks in advance!

You can use divmod for this.
hours, remainder = divmod(someSecondsValue, 3600)
minutes, seconds = divmod(remainder, 60)
print(f"{minutes:02}:{seconds:02}")

You can get number of minutes by dividing by 60
and number of seconds by calculating reminder by 60.
total_seconds = 10000
minutes = int(total_seconds / 60)
seconds = total_seconds % 60
print(f"{minutes}:{seconds}")

You could also make a small custom time class and use __format__ to control how you wanna print it out:
class MyTime:
def __init__(self, seconds: int):
self.total_seconds = seconds
def __format__(self, format_spec: str) -> str:
if format_spec == 'm':
minutes = self.total_seconds // 60
seconds = self.total_seconds % 60
return f'{minutes:02}:{seconds:02}'
if format_spec == 'h':
hours = self.total_seconds // 3600
minutes = (self.total_seconds - hours * 3600) // 60
seconds = self.total_seconds % 60
return f'{hours:02}:{minutes:02}:{seconds:02}'
# ...other formats...
return str(self.total_seconds)
x = MyTime(3674)
print(f'Seconds: {x}') # 3674
print(f'Minutes & seconds: {x:m}') # 61:14
print(f'Hours & minutes & seconds: {x:h}') # 01:01:14

Related

How add two entered number in hour format or seconds

Hi I want to add two elements in the class in Python with magic method 'add' and 'radd' ,that they show the time, the elements can be entered in two different formats: in seconds or in the hour format'16: 03: 43 '
Someone can guide me how can i add seconds with format hour:
(65480 seconds + 16:03:43 hour)
class UserTime:
def __init__(self,uTime):
self.time=uTime
self.backup=0
def __add__(self, other):
return self.time + other.time
'''def conv_ToHours(self,seconds):
seconds = seconds % (24 * 3600)
hour = seconds // 3600
seconds %= 3600
minutes = seconds // 60
seconds %= 60
return "%d:%02d:%02d" % (hour, minutes, seconds)'''
def conve_ToSeconds(self):
"""Get seconds from time."""
h, m, s = self.time.split(':')
return int(h) * 3600 + int(m) * 60 + int(s)
def __add__(self, other):
global x
x=int(self.conve_ToSeconds())+int(other.conve_ToSeconds())
return x
def conv_ToHours(self):
if x> 0 :
seconds = x
seconds = seconds % (24 * 3600)
hour = seconds // 3600
seconds %= 3600
minutes = seconds // 60
seconds %= 60
return "%d:%02d:%02d" % (hour, minutes, seconds)
else:
print('Wrong Wrong')
x= int(input('enter time:'))
y = int(input('enter time: '))

How to code a function that converts label to seconds?

def seconds_to_label_converter(seconds):
hours = divmod(seconds,3600)[0]
minutes = divmod(seconds-(hours*3600),60)[0]
remaining_seconds = seconds-((hours*3600)+(minutes*60))
if remaining_seconds == 0 and hours == 0 and minutes == 0:
time_label = "No info"
elif hours > 1:
time_label = f"{hours} Hours {minutes} Minutes {remaining_seconds} Seconds"
elif hours == 1:
time_label = f"{hours} Hour {minutes} Minutes {remaining_seconds} Seconds"
elif hours == 0 and minutes > 1:
time_label = f"{minutes} Minutes {remaining_seconds} Seconds"
elif hours == 0 and minutes == 1:
time_label = f"{minutes} Minute {remaining_seconds} Seconds"
elif hours == 0 and minutes == 0:
time_label = f"{remaining_seconds} Seconds"
print(time_label)
seconds_to_label_converter(21254)
I have a "seconds to label converter" like this. Now I need a function that will do the opposite. But I don't know how to do it.
for example:
label_to_seconds_converter("5 Hours 54 Minutes 14 Seconds")
# >>> OUTPUT = 21254
Try this. Extract specific strings using re and then extract numbers
import re
def seconds_to_label_converter(seconds):
x=re.findall(r'\b\d+\s*hour[s]?\b',seconds.lower())
y=re.findall(r'\b\d+\s*minute[s]?\b',seconds.lower())
z=re.findall(r'\b\d+\s*second[s]?\b',seconds.lower())
secs=0
if x:
for i in re.findall(r'\d+',''.join(x)):
secs +=3600*int(i)
if y:
for i in re.findall(r'\d+',''.join(y)):
secs +=60*int(i)
if z:
for i in re.findall(r'\d+',''.join(z)):
secs +=int(i)
return secs
print(seconds_to_label_converter('4 hours 50 seconds'))
Returns
14450
print(seconds_to_label_converter('4 hours 10 minutes 50 seconds'))
returns
15050
print(seconds_to_label_converter('5 Hours 54 Minutes 14 Seconds'))
Returns
21254
You could do something like this:
def text_to_second(txt: str):
items = [int(x) if x.isnumeric() else x for x in txt.split() ]
seconds = 0
for i in range(0,len(items),2):
a = items[i+1]
if a.lower()=="hours" or a.lower()=="hour":
seconds += 3600*items[i]
elif a.lower()=="minutes" or a.lower()=="minute":
seconds += 60*items[i]
elif a.lower()=="seconds" or a.lower()=="second":
seconds += items[i]
return seconds
print(text_to_second("5 Hours 54 Minutes 14 Seconds"))
#output: 21254
Another option would be to use the zip function:
def label_to_seconds_converter(label: str) -> int:
label_list = label.split()
seconds = 0
for amount, word in zip(label_list[::2], label_list[1::2]):
if "hour" in word.lower():
seconds += int(amount) * 3600
elif "minute" in word.lower():
seconds += int(amount) * 60
else:
seconds += int(amount)
return seconds
print(label_to_seconds_converter("5 Hours 54 Minutes 14 Seconds"))
result
21254
try this :
def label_to_seconds(label):
times = re.findall(r'\b\d+\s*[hours|minutes|seconds]?\b', label.lower())
list_len = len(times)
if list_len == 3:
return int(times[0].strip()) * 3600 + int(times[0].strip()) * 60 + int(times[0].strip())
if list_len == 2:
return int(times[0].strip()) * 60 + int(times[1].strip())
if list_len == 1:
return int(times[0].strip())
else:
print('Invalid Format')

Time residual function in Python

I have 2 fields in the database: confirmed_at and preparation_time
I would like to get two simple functions that should return:
(a) the time residual
and
(b) the % of time remaining.
This is my logic which I am trying to achieve:
when order is confirmed_at I update the database with datetime.now() and preparation_time is indicated in minutes and stored as integer (for example 5 min is stored as 5)
completed_time is confirmed_at + preparation_time
time_remaining is completed_time - now()
order status is completed_time / now() * 100
These are my functions but I cannot make them work:
def get_remaining_time(self):
start_time = datetime(self.confirmed_at)
end_time = (start_time + datetime.timedelta(0,self.preparation_time*60)).time() # days, seconds.
return end_time - datetime.now()
def get_order_status(self):
end_time = (datetime(self.confirmed_at) + datetime.timedelta(0,self.preparation_time*60)).time()
return end_time / datetime.now() * 100
What kind of type returned from functions? If it's timedelta - just turn it into date.
So here it is the solution that I've managed to work out
def get_remaining_time(self):
start_time = self.confirmed_at
end_time = start_time + timedelta(
0, self.preparation_time * 60
) # days, seconds.
return end_time - timezone.now()
def get_time_left(self):
left = self.get_remaining_time()
sec = int(left.total_seconds())
if sec > 60:
return "{} minutes".format(int(sec / 60))
elif sec < 60 and sec > 0:
return "{} seconds".format(sec)
else:
return 0
def get_order_status(self):
left = int(self.get_remaining_time().total_seconds())
if left < 0:
return 100
else:
return round((1 - left / (self.preparation_time * 60)) * 100)

Adjusting methods within a class

I am having issues with properly implementing the following:
Remove __hours and __minutes.
Adjust the implementation of the mutator and accessor methods. For
example, for __init__(hr, min, sec), validate the values, then set
__seconds = hr * 60 * 60 + min * 60 + sec. This will store the time as seconds. Adjust all the methods to work with __seconds. getSecond()
can use __seconds mod 60 to return only the seconds in the time. Test
all the methods to make sure they still work. (mod is modulus, the
remainder after a division.)
I have used this in my code self.setSecond = (hour * 60 * 60) + (minute * 60 + second)
To properly represent hour, minute and seconds to just seconds I am however having issues with implementing the rest of the program. I'm not sure if I should be printing out just seconds? Also when I change my getSecond() function to return % 60 it is not doing so. I'm assuming because I'm not properly calling it?
Here is my code thus far:
class Clock(object):
def __init__(self, hour, minute, second):
self.setHour(hour)
self.setMinute(minute)
self.setSecond = (hour * 60 * 60) + (minute * 60 + second)
def setHour(self, hour):
self.__hour = hour
if self.__hour > 23:
self.__hour = 0
elif self.__hour < 0:
self.__hour = 0
def getHour(self):
return self.__hour
def setMinute(self, minute):
self.__minute = minute
if self.__minute > 60:
self.__minute = 0
elif self.__minute < 0:
self.__minute = 0
def getMinute(self):
return self.__minute
def setSecond(self, second):
self.__second = second
if self.__second > 60:
self.__second = 0
elif self.__second < 0:
self.__second = 0
def getSecond(self):
return self.__second
def __str__(self):
if self.__hour > 11:
return 'The Time is {}:{}:{} PM'.format(self.__hour, self.__minute, self.__second)
else:
return 'The Time is {}:{}:{} AM'.format(self.__hour, self.__minute, self.setSecond)
stopwatch = Clock(3, 2, 1)
print(stopwatch)
Note: I am aware that this code isn't very pythonic but that is how I was told to keep it (I apologize).
There are 6 changes required primarily:
You don't need to maintain hours and minutes in the class. You maintain only the seconds. So remove the setHour and setMinute methods.
Because you don't maintain the hours and minutes, the getHour and getMinute methods should do the required calculation.
def getHour(self):
return int(self.__second / 3600)
def getMinute(self):
return int(self.__second / 60) % 60
In the init function, call to self.setSecond is not correct. It should be:
def __init__(self, hour, minute, second):
if hour > 23 or hour < 0:
hour = 0
if minute > 60 or minute < 0:
minute = 0
if second > 60 or second < 0:
second = 0
self.setSecond((hour * 60 * 60) + (minute * 60 + second))
And although you mentioned, your getSecond() method does not do a seconds % 60. It should be:
def getSecond(self):
return self.__second % 60
In method def __str__, instead of directly accessing the hours, minutes, seconds, use the accessor methods:
def __str__(self):
if self.getHour() > 11:
return 'The Time is {}:{}:{} PM'.format(self.getHour(), self.getMinute(), self.getSecond())
else:
return 'The Time is {}:{}:{} AM'.format(self.getHour(), self.getMinute(), self.getSecond())
The setSeconds method should not have the check for > 60 because now you will be storing a large number here:
def setSecond(self, second):
self.__second = second
if self.__second < 0:
self.__second = 0

Is there an easier way of doing this? [duplicate]

This question already has answers here:
How do I convert seconds to hours, minutes and seconds?
(18 answers)
Closed 6 years ago.
So I wrote a python code that converts seconds into hour minutes and secs, but the code doesn't look neat. What would be a better way of doing what my script is doing?
from fractions import Fraction as Frac
from decimal import Decimal as Deci
def Hrs(mins,hr=[],deci=[],hrs=True):
return(Seperator(mins/60))
def Seperator(Decimal,num=[],deci=[],nums=True):
del num[:],deci[:]
for item in str(Decimal):
if item == '.':
deci.append(item)
nums = False
continue
num.append(item)if nums else deci.append(item)
return''.join(num),''.join(deci)
def Mins(secs):
t = Deci(float(Frac(secs,60)))
return t
def Secs(deci):
r = Deci(float(deci*60))
return r
def Clean(decimal,deci=[],p=True):
del deci[:]
for item in str(decimal):
if item == '.':
if p:deci.append(item);p=False;continue
else: break
deci.append(item)
return float(''.join(deci))
if __name__ == '__main__':
Seconds = 6033
Hours = Hrs(Mins(Seconds))[0]
Minutes = int(Secs(Clean(Hrs(Mins(Seconds))[1])))
Seconds = int(eval(Seperator(Secs(Clean(Hrs(Mins(Seconds))[1])))[1])*60)
print '{}:{}:{}'.format(Hours,Minutes,Seconds)
Absolutely. Here you go:
def convert(total):
secs = total%60
total /= 60
minutes = total%60
total /= 60
hours = total%24
days = total/24
return (days, hours, minutes, secs)
convert(13246345)
Output: (153, 7, 32, 25)
This should do the trick
import time
localtime = time.localtime()
timeString = time.strftime("%Y%m%d%H%M%S", localtime)
timeString = time.strftime("%H:%M:%S")
print timeString

Categories