I have a variable and I need to know if it is a datetime object.
So far I have been using the following hack in the function to detect datetime object:
i
You can also check using duck typing (as suggested by James).
Here is an example:
from datetime import date, datetime
def is_datetime(dt):
"""
Returns True if is datetime
Returns False if is date
Returns None if it is neither of these things
"""
try:
dt.date()
return True
except:
if isinstance(dt, date):
return False
return None
Results:
In [8]: dt = date.today()
In [9]: tm = datetime.now()
In [10]: is_datetime(dt)
Out[11]: False
In [12]: is_datetime(tm)
Out[13]: True
In [14]: is_datetime("sdf")
In [15]:
isinstance
is your friend
>>> thing = "foo"
>>> isinstance(thing, str)
True
Note, that datetime.date
objects aer not considered to be of datetime.datetime
type, while datetime.datetime
objects are considered to be of datetime.date
type.
import datetime
today = datetime.date.today()
now = datetime.datetime.now()
isinstance(today, datetime.datetime)
>>> False
isinstance(now, datetime.datetime)
>>> True
isinstance(now, datetime.date)
>>> True
isinstance(now, datetime.datetime)
>>> True
I believe all the above answer will work only if date is of type datetime.datetime. What if the date object is of type datetime.time or datetime.date?
This is how I find a datetime object. It always worked for me. (Python2 & Python3):
import datetime
type(date_obj) in (datetime, datetime.date, datetime.datetime, datetime.time)
Testing in Python2 or Python3 shell:
import datetime
d = datetime.datetime.now() # creating a datetime.datetime object.
date = d.date() # type(date): datetime.date
time = d.time() # type(time): datetime.time
type(d) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
type(date) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
type(time) in (datetime, datetime.date, datetime.datetime, datetime.time)
True
You need isinstance(variable, datetime.datetime)
:
>>> import datetime
>>> now = datetime.datetime.now()
>>> isinstance(now, datetime.datetime)
True
Update
As noticed by Davos, datetime.datetime
is a subclass of datetime.date
, which means that the following would also work:
>>> isinstance(now, datetime.date)
True
Perhaps the best approach would be just testing the type (as suggested by Davos):
>>> type(now) is datetime.date
False
>>> type(now) is datetime.datetime
True
Pandas Timestamp
One comment mentioned that in python3.7, that the original solution in this answer returns False
(it works fine in python3.4). In that case, following Davos's comments, you could do following:
>>> type(now) is pandas.Timestamp
If you wanted to check whether an item was of type datetime.datetime
OR pandas.Timestamp
, just check for both
>>> (type(now) is datetime.datetime) or (type(now) is pandas.Timestamp)
Use isinstance
.
if isinstance(variable,datetime.datetime):
print "Yay!"