Skip to main content

pytz_deprecation_shim: Shims to help you safely remove pytz

pytz has served the Python community well for many years, but it is no longer the best option for providing time zones. pytz has a non-standard interface that is very easy to misuse; this interface was necessary when pytz was created, because datetime had no way to represent ambiguous datetimes, but this was solved in in Python 3.6, which added a fold attribute to datetimes in PEP 495. With the addition of the zoneinfo module in Python 3.9 (PEP 615), there has never been a better time to migrate away from pytz.

However, since pytz time zones are used very differently from a standard tzinfo, and many libraries have built pytz zones into their standard time zone interface (and thus may have users relying on the existence of the localize and normalize methods); this library provides shim classes that are compatible with both PEP 495 and pytz’s interface, to make it easier for libraries to deprecate pytz.

Usage

This library is intended for temporary usage only, and should allow you to drop your dependency on pytz while also giving your users notice that eventually you will remove support for the pytz-specific interface.

Within your own code, use pytz_deprecation_shim.timezone shims as if they were zoneinfo or dateutil.tz zones — do not use localize or normalize:

>>> import pytz_deprecation_shim as pds
>>> from datetime import datetime, timedelta
>>> LA = pds.timezone("America/Los_Angeles")

>>> dt = datetime(2020, 10, 31, 12, tzinfo=LA)
>>> print(dt)
2020-10-31 12:00:00-07:00

>>> dt.tzname()
'PDT'

Datetime addition will work like normal Python datetime arithmetic, even across a daylight saving time transition:

>>> dt_add = dt + timedelta(days=1)

>>> print(dt_add)
2020-11-01 12:00:00-08:00

>>> dt_add.tzname()
'PST'

However, if you have exposed a time zone to end users who are using localize and/or normalize or any other pytz-specific features (or if you’ve failed to convert some of your own code all the way), those users will see a warning (rather than an exception) when they use those features:

>>> dt = LA.localize(datetime(2020, 10, 31, 12))
<stdin>:1: PytzUsageWarning: The localize method is no longer necessary, as
this time zone supports the fold attribute (PEP 495). For more details on
migrating to a PEP 495-compliant implementation, see
https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html

 >>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'

>>> dt_add = LA.normalize(dt + timedelta(days=1))
<stdin>:1: PytzUsageWarning: The normalize method is no longer necessary,
as this time zone supports the fold attribute (PEP 495). For more details
on migrating to a PEP 495-compliant implementation, see
https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html

>>> print(dt_add)
2020-11-01 12:00:00-08:00
>>> dt_add.tzname()
'PST'

For IANA time zones, calling str() on the shim zones (and indeed on pytz and zoneinfo zones as well) returns the IANA key, so end users who would like to actively migrate to a zoneinfo (or backports.zoneinfo) can do so:

>>> from zoneinfo import ZoneInfo
>>> LA = pds.timezone("America/Los_Angeles")
>>> LA_zi = ZoneInfo(str(LA))
>>> print(LA_zi)
zoneinfo.ZoneInfo(key='America/Los_Angeles')

Release files for pytz-deprecation-shim 0.1.0.post0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytz-deprecation-shim 0.1.0.post0
File Size Uploaded
pytz_deprecation_shim-0.1.0.post0.tar.gz 60.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytz-deprecation-shim 0.1.0.post0
File Interpreter ABI Platform
pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 75.9 kB

Release files / pytz_deprecation_shim-0.1.0.post0.tar.gz

Download URL pytz_deprecation_shim-0.1.0.post0.tar.gz
Size 60.2 kB
Tags Source
SHA-256 checksum
How to use checksums
af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d
BLAKE2b-256 checksum
How to use checksums
94f0909f94fea74759654390a3e1a9e4e185b6cd9aa810e533e3586f39da3097
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/47.1.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

Release files / pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl

Download URL pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl
Size 15.7 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6
BLAKE2b-256 checksum
How to use checksums
eb733eaab547ca809754e67e06871cff0fc962bafd4b604e15f31896a0f94431
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/47.1.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

Release history Release notifications | RSS feed

This release

0.1.0.post0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page