How to compute the next minute of a time in Python? - python

So I have a datetime.datetime object and I want to compute the next minute of it. What I mean by next minute is the same time but at the very beginning of the next minute. For example, the next minute of 16:38:23.997 is 16:39:00.000.
I can do that easily by adding 1 to the minute and setting every smaller values to 0 (seconds, milliseconds, etc), but I'm not satisfied with this way, because I may need to carry out by checking if the minute becomes higher than 60, and if the hour is bigger than 24... and it ends up being over complicated for what I want to do
Is there a "simple" pythonic way to achieve this ?

Yes, there is a simple and Pythonic way to achieve this. You can use the datetime.replace method to change only the values you want, and leave the others unchanged. Here's an example:
from datetime import datetime, timedelta
def next_minute(dt):
return dt.replace(microsecond=0, second=0) + timedelta(minutes=1)
You can use this function to get the next minute of a datetime object by passing it to the function next_minute(dt). This function first sets the microsecond and second values to 0 using the replace method, and then adds a timedelta of 1 minute to get the next minute.
example:
from datetime import datetime, timedelta
def next_minute(dt):
return dt.replace(microsecond=0, second=0) + timedelta(minutes=1)
current_time = datetime.now()
print("Current time:", current_time)
ext_minute_time = next_minute(current_time)
print("Next minute:", next_minute_time)
#Output
Current time: 2022-02-07 11:38:23.997
Next minute: 2022-02-07 11:39:00

Related

How can I convert time to seconds when the seconds are formatted in 3 digits?

Say I have this time
00:46:19,870
where it represents 46h 19m and 870 is 870/1000 of a minute (I think I can just get rid of the last part). How do I convert this to seconds?
I've tried
time.strptime('00:46:19,870'.split(',')[0],'%H:%M:%S')
but realized that it wouldn't work as it's using a format different than mine.
How can I convert 00:46:19,870 to 2779?
You are close, you can still use the datetime you just need to calculate the time delta. What you really have isn't really a date but what appears to be a stopwatch time time. You can still strip the time from that and you will notice that Python uses a default year, month, and day. You can use that default to figure out the delta in seconds:
from datetime import datetime
DEFAULT_DATE = (1900, 1, 1)
stopwatch = datetime.strptime('00:46:19,870', '%H:%M:%S,%f')
a_timedelta = stopwatch - datetime(*DEFAULT_DATE)
seconds = a_timedelta.total_seconds()
print(seconds)

Get number of seconds until the start of the next hour

I'm currently using a REST API that only allows 1000 queries per hour
Once the 1000 queries are used up, you then have to wait until the beginning of the next hour for the counter to be reset
My aim is to determine the number of seconds that I have to wait until the start of the next hour
I'm currently using the time.sleep method to put the script to sleep until the start of the next hour
I've put together a rather crude solution as follows using the datetime library (adding two minutes to be safe)
import datetime
# Determine the seconds until the next hour (add 2 minutes to be safe)
now = datetime.datetime.now()
next_hour = datetime.datetime(now.year, now.month, now.day, now.hour + 1, 2)
sleep_seconds = (next_hour - now).seconds
# Put the execution to sleep for a while
print("Sleeping for {0} minutes...".format(sleep_seconds // 60))
time.sleep(sleep_seconds)
This script does work but is unreliable when the next hour is the start of the next day.
datetime expects hour values between 0..23
If the
datetime.datetime.now() method returned 23 the method would fail
if you pass 24 to the datetime object
It would also be unreliable if the next day crossed into the next month or year as well.
Could someone suggest a better solution that would account for these wrap around issues?
Think datetime.timedelta will help you in this case. Something like this:
import datetime
delta = datetime.timedelta(hours=1)
now = datetime.datetime.now()
next_hour = (now + delta).replace(microsecond=0, second=0, minute=2)
wait_seconds = (next_hour - now).seconds
The replace should work to round you down to the next hour.

Current time within the range

I need to find the Time which is an hour head of current system time in python, for example if current time is 2:00 the end time should be 3:00 so that i can compare that my current time is within the range of the time period.Actually I need to carry out a task only during the time period ,So can someone help me!
Use datetime.now() to get the current time, save it, call datetime.now() again when you need to check the time and subtract it by the starting time to get a timedelta to check if it's less than 1 hour:
from datetime import datetime, timedelta
start = datetime.now()
while datetime.now() - start <= timedelta(hours=1):
do_work()
#blhsing is a good answer but there is a simpler and cost-effective way:
import time
end = time.clock() + 3600 # add hour
while time.clock() < end:
...

When I substract two datetime object in python it is considering only time not taking day

I have two date time objects
`statrt_time` and `end_time`
my code is
if self.book_from and self.book_to:
fmt = '%Y-%m-%d %H:%M:%S'
s = datetime.strptime(self.book_from,fmt) #start date
e = datetime.strptime(self.book_to,fmt) #end date
diff = e - s
total_seconds=diff.seconds
time_diff = (total_seconds/3600.0)
no_of_units = (time_diff/4)
if(e<s):
self.units = 0
else:
self.units = math.ceil(no_of_units)
Here when I subtract time within the same day it is giving the correct difference. But when the day is changed, it is not calculating the day difference but only giving time difference. How can I add day difference also?
Use total_seconds() instead of seconds.
timedelta.seconds just shows "second" part of the difference, while total_seconds() shows the duration of the difference in seconds. See Mureinik's answer for more details.
So, use this:
total_seconds=diff.total_seconds()
total_seconds is a timedelta object which stores the difference between two datetimes using three fields - days, seconds and miliseconds. Your snippet just uses the seconds attributes instead of the entire difference. The total_seconds() method takes care of this for you and returns, well, the total number of seconds between two datatimes.
I got another way of doing.. BUT A WORK AROUND..
if self.book_from and self.book_to:
fmt = '%Y-%m-%d %H:%M:%S'
s = datetime.strptime(self.book_from,fmt) #start date
e = datetime.strptime(self.book_to,fmt) #end date
diff = e - s
days=diff.days// convert difference to day instead of seconds//
days_seconds=0
if(days>0): //Checking whether the difference exceeds a day//
days_seconds=days*24*3600 //If so convert it to seconds//
total_seconds=diff.seconds+days_seconds
time_diff = (total_seconds/3600.0)

Compare only time part in datetime - Python

I want to compare only time part in datetime. I have different dates with only time field to compare. Since dates are different and only time part i want to consider So i think creating two datetime object will not help.
my string as
start="22:00:00"
End="03:00:00"
Tocompare="23:30:00"
Above are strings when i convert them with datetime as
dt=datetime.strptime(start,"%H:%M:%S")
it gives
1900-01-01 22:00:00
which is default date in python.
So i need to avoid all this and want only time part. I simply need to check does my Tocompare falls between start and End
Just call the .time() method of the datetime objects to get their hours, minutes, seconds and microseconds.
dt = datetime.strptime(start,"%H:%M:%S").time()
Compare their times using datetime.time().
import datetime
start = datetime.datetime.strptime(start, '%H:%M:%S')
start = datetime.time(start.hour, start.minute,start.second)
tocompare = datetime.datetime.strptime(tocompare, '%H:%M:%S')
tocompare = datetime.time(tocompare.hour, tocompare.minute, tocompare.second)
start > tocompare # False

Categories