python time + timedelta equivalent
The solution is in the link that you provided in your question:
datetime.combine(date.today(), time()) + timedelta(hours=1)
Full example:
from datetime import date, datetime, time, timedelta
dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()
Output:
00:25:00
How do I find the time difference between two datetime objects in python?
>>> import datetime
>>> first_time = datetime.datetime.now()
>>> later_time = datetime.datetime.now()
>>> difference = later_time - first_time
datetime.timedelta(0, 8, 562000)
>>> seconds_in_day = 24 * 60 * 60
>>> divmod(difference.days * seconds_in_day + difference.seconds, 60)
(0, 8) # 0 minutes, 8 seconds
Subtracting the later time from the first time difference = later_time - first_time
creates a datetime object that only holds the difference.
In the example above it is 0 minutes, 8 seconds and 562000 microseconds.
What is the standard way to add N seconds to datetime.time in Python?
You can use full datetime
variables with timedelta
, and by providing a dummy date then using time
to just get the time value.
For example:
import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print(a.time())
print(b.time())
results in the two values, three seconds apart:
11:34:59
11:35:02
You could also opt for the more readable
b = a + datetime.timedelta(seconds=3)
if you're so inclined.
If you're after a function that can do this, you can look into using addSecs
below:
import datetime
def addSecs(tm, secs):
fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
fulldate = fulldate + datetime.timedelta(seconds=secs)
return fulldate.time()
a = datetime.datetime.now().time()
b = addSecs(a, 300)
print(a)
print(b)
This outputs:
09:11:55.775695
09:16:55
How to create a DateTime equal to 15 minutes ago?
import datetime and then the magic timedelta stuff:
In [63]: datetime.datetime.now()
Out[63]: datetime.datetime(2010, 12, 27, 14, 39, 19, 700401)
In [64]: datetime.datetime.now() - datetime.timedelta(minutes=15)
Out[64]: datetime.datetime(2010, 12, 27, 14, 24, 21, 684435)
How do I get time from a datetime.timedelta object?
It's strange that Python returns the value as a datetime.timedelta
. It probably should return a datetime.time
. Anyway, it looks like it's returning the elapsed time since midnight (assuming the column in the table is 6:00 PM). In order to convert to a datetime.time
, you can do the following::
value = datetime.timedelta(0, 64800)
(datetime.datetime.min + value).time()
datetime.datetime.min
and datetime.time()
are, of course, documented as part of the datetime module if you want more information.
A datetime.timedelta
is, by the way, a representation of the difference between two datetime.datetime
values. So if you subtract one datetime.datetime
from another, you will get a datetime.timedelta
. And if you add a datetime.datetime
with a datetime.timedelta
, you'll get a datetime.datetime
. That's how the code above works.
Python - Date & Time Comparison using timestamps, timedelta
You should be able to use
tdelta.total_seconds()
to get the value you are looking for. This is because tdelta
is a timedelta
object, as is any difference between datetime
objects.
A couple of notes:
- Using
strftime
followed bystrptime
is superfluous. You should be able to get the current datetime withdatetime.now
. - Similarly, using
time.ctime
followed bystrptime
is more work than needed. You should be able to get the otherdatetime
object withdatetime.fromtimestamp
.
So, your final code could be
now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()
How to construct a timedelta object from a simple string
For the first format (5hr34m56s
), you should parse using regular expressions
Here is re-based solution:
import re
from datetime import timedelta
regex = re.compile(r'((?P<hours>\d+?)hr)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?')
def parse_time(time_str):
parts = regex.match(time_str)
if not parts:
return
parts = parts.groupdict()
time_params = {}
for name, param in parts.items():
if param:
time_params[name] = int(param)
return timedelta(**time_params)
>>> from parse_time import parse_time
>>> parse_time('12hr')
datetime.timedelta(0, 43200)
>>> parse_time('12hr5m10s')
datetime.timedelta(0, 43510)
>>> parse_time('12hr10s')
datetime.timedelta(0, 43210)
>>> parse_time('10s')
datetime.timedelta(0, 10)
>>>
Formatting timedelta objects
But I was wondering if I can do it in a single line using any date time function like
strftime
.
As far as I can tell, there isn't a built-in method to timedelta
that does that. If you're doing it often, you can create your own function, e.g.
def strfdelta(tdelta, fmt):
d = {"days": tdelta.days}
d["hours"], rem = divmod(tdelta.seconds, 3600)
d["minutes"], d["seconds"] = divmod(rem, 60)
return fmt.format(**d)
Usage:
>>> print strfdelta(delta_obj, "{days} days {hours}:{minutes}:{seconds}")
1 days 20:18:12
>>> print strfdelta(delta_obj, "{hours} hours and {minutes} to go")
20 hours and 18 to go
If you want to use a string format closer to the one used by strftime
we can employ string.Template
:
from string import Template
class DeltaTemplate(Template):
delimiter = "%"
def strfdelta(tdelta, fmt):
d = {"D": tdelta.days}
d["H"], rem = divmod(tdelta.seconds, 3600)
d["M"], d["S"] = divmod(rem, 60)
t = DeltaTemplate(fmt)
return t.substitute(**d)
Usage:
>>> print strfdelta(delta_obj, "%D days %H:%M:%S")
1 days 20:18:12
>>> print strfdelta(delta_obj, "%H hours and %M to go")
20 hours and 18 to go
The
totalSeconds
value is shown as 13374 instead of 99774. I.e. it's ignoring the "day" value.
Note in the example above that you can use timedelta.days
to get the "day" value.
Alternatively, from Python 2.7 onwards, timedelta has a total_seconds() method which return the total number of seconds contained in the duration.
Related Topics
What Is an 'Endpoint' in Flask
How to Add a Question Mark [] Button on the Top of a Tkinter Window
Python Raises Syntaxerror on "=" in If Statement
Why Does Appending to One List Also Append to All Other Lists in My List of Lists
What's a Good Equivalent to Subprocess.Check_Call That Returns the Contents of Stdout
How to Plot Normal Distribution
Importerror: No Module Named <Something>
How to Rotate a Matplotlib Plot Through 90 Degrees
Python Requests.Get Always Get 404
Region: Ioerror: [Errno 22] Invalid Mode ('W') or Filename
Remove Duplicate Rows from Pandas Dataframe Where Only Some Columns Have the Same Value
How to Set Selenium Webdriver from Headless Mode to Normal Mode Within the Same Session
Regular Expression: Match Start or Whitespace
Directing Print Output to a .Txt File
Restricting the Value in Tkinter Entry Widget