Python’s Datetime module is a powerful addition to the standard library and helps make short work out of — you guessed it — managing dates and times. The syntax for importing the main Datetime class is a bit redundant and, in some cases, causes confusion.
To avoid AttributeError exceptions, one must ensure that the Datetime class is imported from the datetime module. Otherwise, one is left trying to import specific methods and functions from the module level vs. the class level where they actually reside.
Basic Datetime Example
Many of the useful functions in the datetime module are found within the Datetime class. These are accessed via standard dot-notation. Here’s an example of proper usage:
from datetime import datetime # Create a datetime for now now = datetime.now() # View result print(now, type(now)) 2022-07-08 09:32:17.285837 <class 'datetime.datetime'> # Create a formatted string version timestamp = now.strftime("%Y-%m-%d") # View result print(timestamp, type(timestamp)) 2022-07-08 <class 'str'>
Here we see a datetime object created representing the current system time, agnostic of timezone (another conversation entirely!) From there, the
strftime method is used in conjunction with formatting arguments to specify how this should be displayed as a timestamp in human-readable form. Note that the result of this is a
str object and no longer a
Another common use is the conversion of a
str class timestamp (like the result from above) into a proper
datetime object. This is also easy via the
strptime method as such:
from datetime import datetime # Have a string-class timestamp sts = '2022-07-08' # Convert to datetime object dt = datetime.strptime(sts, "%Y-%d-%m") print(dt, type(dt)) 2022-08-07 00:00:00 <class 'datetime.datetime'>
Here we seen the
str timestamp get converted via the
strptime method with the only requirement being that we specified the format via
%Y-%m-%d. This ensures that the
datetime object contains the proper information.
During the above use cases, one might find an
AttributeError being generated. In some cases, this could be a multithreading issue. However, in most cases, it’s a simple syntactic concern resulting from an improper import statement. Consider the following code:
import datetime # Have a string-class timestamp sts = '2022-07-08' # Convert to datetime object dt = datetime.strptime(sts, "%Y-%d-%m") print(dt, type(dt)) Traceback (most recent call last): File "C:/path/to/your/file.py", line 7, in <module> dt = datetime.strptime(sts, "%Y-%d-%m") AttributeError: module 'datetime' has no attribute 'strptime'
AttributeError: module 'datetime' has no attribute 'strptime' is generated in this case because we are attempting to call the
strptime method from the
datetime module rather than an instance of the
- import datetime (incorrect syntax)
- from datetime import datetime (correct syntax)
In this case, the error could be avoided without changing the import statement via the following syntax:
import datetime # Have a string-class timestamp sts = '2022-07-08' # Convert to datetime object dt = datetime.datetime.strptime(sts, "%Y-%d-%m") # < ------ note extra datetime print(dt, type(dt)) 2022-08-07 00:00:00 <class 'datetime.datetime'>
Note the use of the
datetime.datetime syntax here vs. the
datetime syntax previously. This is accessing the class from the module as required.
datetime module provides a host of tools to help make managing timestamps easy in Python. The redundant syntax required by import statements allows for easy syntactic errors and, in some cases, results in frustrating bugs. Keeping in mind that the
datetime class is where the action happens can help avoid (or debug) these annoying AttributeError: ‘datetime’ module has no attribute ‘strptime’ type messages.