Pendulum
Pendulum is a Python package designed to simplify datetime manipulation, offering a more intuitive API and robust timezone handling than Python's native `datetime` module. It provides drop-in replacements for standard datetime classes, making integration seamless. Currently at version 3.2.0, Pendulum maintains an active release cadence, often aligning with new Python versions or significant feature enhancements.
Common errors
-
ModuleNotFoundError: No module named 'pendulum'
cause The 'pendulum' library is not installed in the Python environment where the code is being executed, or the environment is not correctly activated.fixEnsure Pendulum is installed in your active Python environment using pip: `pip install pendulum`. -
AttributeError: 'DateTime' object has no attribute 'nanosecond'
cause This error often occurs when a `pendulum.DateTime` object is passed to a library (like Pandas) that expects a native Python `datetime` object or has specific attribute expectations not present in `pendulum.DateTime` directly.fixConvert the `pendulum.DateTime` object to a standard `datetime.datetime` object before passing it to the external library: `my_pendulum_dt.in_timezone('UTC').replace(tzinfo=None) # for naive datetime` or `my_pendulum_dt.in_timezone('UTC')._datetime # for timezone-aware datetime.datetime` (though direct attribute access is generally discouraged, `to_datetime_string()` or `isoformat()` can also be used depending on the need to represent it as a string). -
pendulum.parsing.exceptions.ParserError: Unable to parse string [...]
cause The `pendulum.parse()` method was unable to interpret the provided string into a valid date and time, often because the string format is not natively supported or is ambiguous.fixFor non-standard or complicated strings, use `pendulum.from_format()` with an explicit format string, or pass `exact=False` (formerly `strict=False`) to `pendulum.parse()` to allow it to fall back on `dateutil` parsing: `pendulum.parse('2023-01-01 10:30:00', exact=False)` or `pendulum.from_format('2023/01/01', 'YYYY/MM/DD')`. -
TypeError: datetime() got an unexpected keyword argument 'dst_rule'
cause The `dst_rule` keyword argument was removed in Pendulum 3.0.0, which introduced breaking changes to simplify the API and improve standard library compatibility.fixRemove the `dst_rule` argument from your `pendulum.datetime()` calls. Pendulum 3.x handles DST transitions implicitly and correctly without this explicit parameter. If specific DST behavior is needed, leverage `in_timezone()` or ensure your timezone strings are correctly specified. -
AttributeError: 'DateTime' object has no attribute 'add_timedelta'
cause The `add_timedelta` method was deprecated and removed in Pendulum 2.x and later, replaced by the more intuitive `add()` and `subtract()` methods, or direct arithmetic.fixUse the `add()` method with keyword arguments for time units or direct addition with `datetime.timedelta` objects: `dt.add(hours=1, minutes=30)` or `dt + timedelta(hours=1, minutes=30)`.
Warnings
- breaking Pendulum 3.0.0 dropped support for Python 2.7, 3.5, 3.6, and 3.7. Version 3.1.0 further dropped support for Python 3.8. The library now requires Python >= 3.9.
- breaking The `Period` class and its associated `period` helper were renamed to `Interval` and `interval` respectively in Pendulum 3.0.0.
- breaking The default string representation (`str(dt)`) of `DateTime` instances changed in 3.0.0 to align with Python's standard library `datetime` output (e.g., from `T` separator to space).
- breaking Existing testing helpers like `pendulum.test()` and `pendulum.set_test_now()` were removed in 3.0.0. New testing helpers, which rely on the `time-machine` library, were introduced and require installing Pendulum with the `[test]` extra (e.g., `pip install "pendulum[test]"`).
- gotcha The `tz` argument for `pendulum.datetime()` is keyword-only since Pendulum 2.x, differing from Python's native `datetime` constructor.
- deprecated The `Timezone` class in Pendulum 3.0.0 now relies on Python's native `zoneinfo.ZoneInfo` class (available from Python 3.9+). While not a direct breaking change, users on older Python versions (not applicable for Pendulum 3.x's requirements) previously relied on Pendulum's internal timezone handling which has been streamlined.
- deprecated The `pytz` dependency was removed in Pendulum 3.2.0, streamlining timezone management to rely on standard library features (`zoneinfo`).
Install
-
pip install pendulum -
pip install "pendulum[test]"
Imports
- datetime
from datetime import datetime dt = datetime(2026, 3, 28, 10, 0, 0)
import pendulum dt = pendulum.datetime(2026, 3, 28, 10, 0, 0, tz='UTC')
- now
import pendulum current_time = pendulum.now('Europe/Paris') - parse
import pendulum dt = pendulum.parse('2026-03-28T10:00:00+02:00')
Quickstart
import pendulum
# Get current time in a specific timezone
now_paris = pendulum.now('Europe/Paris')
print(f"Current time in Paris: {now_paris}")
# Create a specific datetime
birthday = pendulum.datetime(1990, 7, 15, tz='America/New_York')
print(f"My birthday: {birthday}")
# Add time
next_week = now_paris.add(weeks=1, days=2)
print(f"Next week and two days: {next_week}")
# Calculate difference in a human-readable format
diff = next_week.diff_for_humans(now_paris)
print(f"Difference: {diff}")
# Convert to another timezone
now_london = now_paris.in_timezone('Europe/London')
print(f"Current time in London: {now_london}")