Repository: equinor/tagreader-python (language: python)

Issue:
AttributeError: 'str' object has  no attribute 'localize' with c.read()
tagreader version is 4.2.3
python version 3.10.12

Extracting values using a specific time zone is returning an error. I've copied something like the below, but am using "US/Eastern". When not setting tz="US/Eastern", c.read() works, and the default time zone is UTC+2

```
import tagreader
c = tagreader.IMSClient("PINO", "pi", tz="US/Central")  # Force output data to Houston time
c.connect()
start_time = "01-Jan-2022 00:00:00"
end_time = "01-Feb-2022 00:00:00"
df = c.read([f"{tag}"], start_time, end_time, ts=f"{ts_val})

```

The error is populating in tagreader\utils.py:88
```
date_stamp = convert_to_pydatetime(date_stamp)
if not date_stamp.tzinfo:
  date_stamp = tz.localize(date_stamp)
```


Discussion / hints:
@DWMorrow, thank you for reporting this issue. We will look at this shortly.

Fix patch:
diff --git a/poetry.lock b/poetry.lock
index 592b71cb..1a05ec21 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
 
 [[package]]
 name = "anyio"
 version = "3.7.0"
 description = "High level compatibility layer for multiple asynchronous event loop implementations"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -26,7 +25,6 @@ trio = ["trio (<0.22)"]
 name = "appnope"
 version = "0.1.3"
 description = "Disable App Nap on macOS >= 10.9"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -38,7 +36,6 @@ files = [
 name = "argon2-cffi"
 version = "21.3.0"
 description = "The secure Argon2 password hashing algorithm."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -58,7 +55,6 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
 name = "argon2-cffi-bindings"
 version = "21.2.0"
 description = "Low-level CFFI bindings for Argon2"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -96,7 +92,6 @@ tests = ["pytest"]
 name = "arrow"
 version = "1.2.3"
 description = "Better dates & times for Python"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -111,7 +106,6 @@ python-dateutil = ">=2.7.0"
 name = "asttokens"
 version = "2.2.1"
 description = "Annotate AST trees with source code positions"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -129,7 +123,6 @@ test = ["astroid", "pytest"]
 name = "attrs"
 version = "23.1.0"
 description = "Classes Without Boilerplate"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -148,7 +141,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
 name = "backcall"
 version = "0.2.0"
 description = "Specifications for callback functions passed in to an API"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -160,7 +152,6 @@ files = [
 name = "beautifulsoup4"
 version = "4.12.2"
 description = "Screen-scraping library"
-category = "main"
 optional = true
 python-versions = ">=3.6.0"
 files = [
@@ -179,7 +170,6 @@ lxml = ["lxml"]
 name = "bleach"
 version = "6.0.0"
 description = "An easy safelist-based HTML-sanitizing tool."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -196,21 +186,19 @@ css = ["tinycss2 (>=1.1.0,<1.2)"]
 
 [[package]]
 name = "certifi"
-version = "2023.5.7"
+version = "2023.7.22"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
-    {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"},
-    {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"},
+    {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"},
+    {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"},
 ]
 
 [[package]]
 name = "cffi"
 version = "1.15.1"
 description = "Foreign Function Interface for Python calling C code."
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -287,7 +275,6 @@ pycparser = "*"
 name = "cfgv"
 version = "3.3.1"
 description = "Validate configuration and produce human readable error messages."
-category = "dev"
 optional = false
 python-versions = ">=3.6.1"
 files = [
@@ -299,7 +286,6 @@ files = [
 name = "charset-normalizer"
 version = "3.1.0"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -384,7 +370,6 @@ files = [
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -396,7 +381,6 @@ files = [
 name = "comm"
 version = "0.1.3"
 description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -416,7 +400,6 @@ typing = ["mypy (>=0.990)"]
 name = "contourpy"
 version = "1.1.0"
 description = "Python library for calculating contours of 2D quadrilateral grids"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -473,31 +456,34 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"]
 
 [[package]]
 name = "cryptography"
-version = "41.0.1"
+version = "41.0.3"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
-    {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"},
-    {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"},
-    {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"},
-    {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"},
-    {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"},
-    {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"},
-    {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"},
-    {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"},
-    {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"},
-    {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"},
-    {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"},
-    {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"},
-    {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"},
-    {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"},
-    {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"},
-    {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"},
-    {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"},
-    {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"},
-    {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"},
+    {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:652627a055cb52a84f8c448185922241dd5217443ca194d5739b44612c5e6507"},
+    {file = "cryptography-41.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8f09daa483aedea50d249ef98ed500569841d6498aa9c9f4b0531b9964658922"},
+    {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd871184321100fb400d759ad0cddddf284c4b696568204d281c902fc7b0d81"},
+    {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84537453d57f55a50a5b6835622ee405816999a7113267739a1b4581f83535bd"},
+    {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3fb248989b6363906827284cd20cca63bb1a757e0a2864d4c1682a985e3dca47"},
+    {file = "cryptography-41.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:42cb413e01a5d36da9929baa9d70ca90d90b969269e5a12d39c1e0d475010116"},
+    {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:aeb57c421b34af8f9fe830e1955bf493a86a7996cc1338fe41b30047d16e962c"},
+    {file = "cryptography-41.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6af1c6387c531cd364b72c28daa29232162010d952ceb7e5ca8e2827526aceae"},
+    {file = "cryptography-41.0.3-cp37-abi3-win32.whl", hash = "sha256:0d09fb5356f975974dbcb595ad2d178305e5050656affb7890a1583f5e02a306"},
+    {file = "cryptography-41.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:a983e441a00a9d57a4d7c91b3116a37ae602907a7618b882c8013b5762e80574"},
+    {file = "cryptography-41.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5259cb659aa43005eb55a0e4ff2c825ca111a0da1814202c64d28a985d33b087"},
+    {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:67e120e9a577c64fe1f611e53b30b3e69744e5910ff3b6e97e935aeb96005858"},
+    {file = "cryptography-41.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7efe8041897fe7a50863e51b77789b657a133c75c3b094e51b5e4b5cec7bf906"},
+    {file = "cryptography-41.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce785cf81a7bdade534297ef9e490ddff800d956625020ab2ec2780a556c313e"},
+    {file = "cryptography-41.0.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57a51b89f954f216a81c9d057bf1a24e2f36e764a1ca9a501a6964eb4a6800dd"},
+    {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c2f0d35703d61002a2bbdcf15548ebb701cfdd83cdc12471d2bae80878a4207"},
+    {file = "cryptography-41.0.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:23c2d778cf829f7d0ae180600b17e9fceea3c2ef8b31a99e3c694cbbf3a24b84"},
+    {file = "cryptography-41.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:95dd7f261bb76948b52a5330ba5202b91a26fbac13ad0e9fc8a3ac04752058c7"},
+    {file = "cryptography-41.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:41d7aa7cdfded09b3d73a47f429c298e80796c8e825ddfadc84c8a7f12df212d"},
+    {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d0d651aa754ef58d75cec6edfbd21259d93810b73f6ec246436a21b7841908de"},
+    {file = "cryptography-41.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ab8de0d091acbf778f74286f4989cf3d1528336af1b59f3e5d2ebca8b5fe49e1"},
+    {file = "cryptography-41.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a74fbcdb2a0d46fe00504f571a2a540532f4c188e6ccf26f1f178480117b33c4"},
+    {file = "cryptography-41.0.3.tar.gz", hash = "sha256:6d192741113ef5e30d89dcb5b956ef4e1578f304708701b8b73d38e3e1461f34"},
 ]
 
 [package.dependencies]
@@ -517,7 +503,6 @@ test-randomorder = ["pytest-randomly"]
 name = "cycler"
 version = "0.11.0"
 description = "Composable style cycles"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -529,7 +514,6 @@ files = [
 name = "debugpy"
 version = "1.6.7"
 description = "An implementation of the Debug Adapter Protocol for Python"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -557,7 +541,6 @@ files = [
 name = "decorator"
 version = "5.1.1"
 description = "Decorators for Humans"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -569,7 +552,6 @@ files = [
 name = "defusedxml"
 version = "0.7.1"
 description = "XML bomb protection for Python stdlib modules"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -581,7 +563,6 @@ files = [
 name = "diskcache"
 version = "5.6.1"
 description = "Disk Cache -- Disk and file backed persistent cache."
-category = "main"
 optional = false
 python-versions = ">=3"
 files = [
@@ -593,7 +574,6 @@ files = [
 name = "distlib"
 version = "0.3.6"
 description = "Distribution utilities"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -605,7 +585,6 @@ files = [
 name = "exceptiongroup"
 version = "1.1.1"
 description = "Backport of PEP 654 (exception groups)"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -620,7 +599,6 @@ test = ["pytest (>=6)"]
 name = "executing"
 version = "1.2.0"
 description = "Get the currently executing AST node of a frame, and other information"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -635,7 +613,6 @@ tests = ["asttokens", "littleutils", "pytest", "rich"]
 name = "fastjsonschema"
 version = "2.17.1"
 description = "Fastest Python implementation of JSON schema"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -650,7 +627,6 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
 name = "filelock"
 version = "3.12.2"
 description = "A platform independent file lock."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -666,7 +642,6 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p
 name = "fonttools"
 version = "4.40.0"
 description = "Tools to manipulate font files"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -724,7 +699,6 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
 name = "fqdn"
 version = "1.5.1"
 description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4"
 files = [
@@ -736,7 +710,6 @@ files = [
 name = "gssapi"
 version = "1.8.2"
 description = "Python GSSAPI Wrapper"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -769,7 +742,6 @@ decorator = "*"
 name = "identify"
 version = "2.5.24"
 description = "File identification library for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -784,7 +756,6 @@ license = ["ukkonen"]
 name = "idna"
 version = "3.4"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -796,7 +767,6 @@ files = [
 name = "importlib-metadata"
 version = "6.7.0"
 description = "Read metadata from Python packages"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -816,7 +786,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs
 name = "importlib-resources"
 version = "5.12.0"
 description = "Read resources from Python packages"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -835,7 +804,6 @@ testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-chec
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -847,7 +815,6 @@ files = [
 name = "ipykernel"
 version = "6.23.3"
 description = "IPython Kernel for Jupyter"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -861,13 +828,13 @@ comm = ">=0.1.1"
 debugpy = ">=1.6.5"
 ipython = ">=7.23.1"
 jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
 matplotlib-inline = ">=0.1"
 nest-asyncio = "*"
 packaging = "*"
 psutil = "*"
 pyzmq = ">=20"
-tornado = ">=6.1"
+tornado = ">=6.3.2"
 traitlets = ">=5.4.0"
 
 [package.extras]
@@ -881,7 +848,6 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio"
 name = "ipython"
 version = "8.12.2"
 description = "IPython: Productive Interactive Computing"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -921,7 +887,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa
 name = "ipython-genutils"
 version = "0.2.0"
 description = "Vestigial utilities from IPython"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -933,7 +898,6 @@ files = [
 name = "ipywidgets"
 version = "8.0.6"
 description = "Jupyter interactive widgets"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -955,7 +919,6 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"]
 name = "isoduration"
 version = "20.11.0"
 description = "Operations with ISO 8601 durations"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -970,7 +933,6 @@ arrow = ">=0.15.0"
 name = "jedi"
 version = "0.18.2"
 description = "An autocompletion tool for Python that can be used for text editors."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -990,7 +952,6 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
 name = "jinja2"
 version = "3.1.2"
 description = "A very fast and expressive template engine."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1008,7 +969,6 @@ i18n = ["Babel (>=2.7)"]
 name = "jsonpointer"
 version = "2.4"
 description = "Identify specific nodes in a JSON document (RFC 6901)"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
 files = [
@@ -1020,7 +980,6 @@ files = [
 name = "jsonschema"
 version = "4.17.3"
 description = "An implementation of JSON Schema validation for Python"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1050,7 +1009,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
 name = "jupyter"
 version = "1.0.0"
 description = "Jupyter metapackage. Install all the Jupyter components in one go."
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -1071,7 +1029,6 @@ qtconsole = "*"
 name = "jupyter-client"
 version = "8.3.0"
 description = "Jupyter protocol implementation and client libraries"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1081,7 +1038,7 @@ files = [
 
 [package.dependencies]
 importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
 python-dateutil = ">=2.8.2"
 pyzmq = ">=23.0"
 tornado = ">=6.2"
@@ -1095,7 +1052,6 @@ test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pyt
 name = "jupyter-console"
 version = "6.6.3"
 description = "Jupyter terminal console"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1107,7 +1063,7 @@ files = [
 ipykernel = ">=6.14"
 ipython = "*"
 jupyter-client = ">=7.0.0"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
 prompt-toolkit = ">=3.0.30"
 pygments = "*"
 pyzmq = ">=17"
@@ -1120,7 +1076,6 @@ test = ["flaky", "pexpect", "pytest"]
 name = "jupyter-core"
 version = "5.3.1"
 description = "Jupyter core package. A base package on which Jupyter projects rely."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1141,7 +1096,6 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"]
 name = "jupyter-events"
 version = "0.6.3"
 description = "Jupyter Event System library"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1166,7 +1120,6 @@ test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=
 name = "jupyter-server"
 version = "2.7.0"
 description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1179,7 +1132,7 @@ anyio = ">=3.1.0"
 argon2-cffi = "*"
 jinja2 = "*"
 jupyter-client = ">=7.4.4"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
 jupyter-events = ">=0.6.0"
 jupyter-server-terminals = "*"
 nbconvert = ">=6.4.4"
@@ -1203,7 +1156,6 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc
 name = "jupyter-server-terminals"
 version = "0.4.4"
 description = "A Jupyter Server Extension Providing Terminals."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1223,7 +1175,6 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov",
 name = "jupyterlab-pygments"
 version = "0.2.2"
 description = "Pygments theme using JupyterLab CSS variables"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1235,7 +1186,6 @@ files = [
 name = "jupyterlab-widgets"
 version = "3.0.7"
 description = "Jupyter interactive widgets for JupyterLab"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1247,7 +1197,6 @@ files = [
 name = "kiwisolver"
 version = "1.4.4"
 description = "A fast implementation of the Cassowary constraint solver"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1325,7 +1274,6 @@ files = [
 name = "krb5"
 version = "0.5.0"
 description = "Kerberos API bindings for Python"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1345,7 +1293,6 @@ files = [
 name = "markupsafe"
 version = "2.1.3"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1405,7 +1352,6 @@ files = [
 name = "matplotlib"
 version = "3.7.1"
 description = "Python plotting package"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1468,7 +1414,6 @@ python-dateutil = ">=2.7"
 name = "matplotlib-inline"
 version = "0.1.6"
 description = "Inline Matplotlib backend for Jupyter"
-category = "main"
 optional = true
 python-versions = ">=3.5"
 files = [
@@ -1483,7 +1428,6 @@ traitlets = "*"
 name = "mistune"
 version = "3.0.1"
 description = "A sane and fast Markdown parser with useful plugins and renderers"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1495,7 +1439,6 @@ files = [
 name = "nbclassic"
 version = "1.0.0"
 description = "Jupyter Notebook as a Jupyter Server extension."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1531,7 +1474,6 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-p
 name = "nbclient"
 version = "0.8.0"
 description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
-category = "main"
 optional = true
 python-versions = ">=3.8.0"
 files = [
@@ -1541,7 +1483,7 @@ files = [
 
 [package.dependencies]
 jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
+jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
 nbformat = ">=5.1"
 traitlets = ">=5.4"
 
@@ -1554,7 +1496,6 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=
 name = "nbconvert"
 version = "7.6.0"
 description = "Converting Jupyter Notebooks"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1593,7 +1534,6 @@ webpdf = ["pyppeteer (>=1,<1.1)"]
 name = "nbformat"
 version = "5.9.0"
 description = "The Jupyter Notebook format"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1615,7 +1555,6 @@ test = ["pep440", "pre-commit", "pytest", "testpath"]
 name = "nest-asyncio"
 version = "1.5.6"
 description = "Patch asyncio to allow nested event loops"
-category = "main"
 optional = true
 python-versions = ">=3.5"
 files = [
@@ -1627,7 +1566,6 @@ files = [
 name = "nodeenv"
 version = "1.8.0"
 description = "Node.js virtual environment builder"
-category = "dev"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
 files = [
@@ -1642,7 +1580,6 @@ setuptools = "*"
 name = "notebook"
 version = "6.5.4"
 description = "A web-based notebook environment for interactive computing"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1677,7 +1614,6 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixs
 name = "notebook-shim"
 version = "0.2.3"
 description = "A shim layer for notebook traits and config"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1695,7 +1631,6 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"
 name = "numpy"
 version = "1.24.4"
 description = "Fundamental package for array computing in Python"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1733,7 +1668,6 @@ files = [
 name = "overrides"
 version = "7.3.1"
 description = "A decorator to automatically detect mismatch when overriding a method."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1745,7 +1679,6 @@ files = [
 name = "packaging"
 version = "23.1"
 description = "Core utilities for Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1757,7 +1690,6 @@ files = [
 name = "pandas"
 version = "2.0.2"
 description = "Powerful data structures for data analysis, time series, and statistics"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1825,7 +1757,6 @@ xml = ["lxml (>=4.6.3)"]
 name = "pandocfilters"
 version = "1.5.0"
 description = "Utilities for writing pandoc filters in python"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -1837,7 +1768,6 @@ files = [
 name = "parso"
 version = "0.8.3"
 description = "A Python Parser"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1853,7 +1783,6 @@ testing = ["docopt", "pytest (<6.0.0)"]
 name = "pexpect"
 version = "4.8.0"
 description = "Pexpect allows easy control of interactive console applications."
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -1868,7 +1797,6 @@ ptyprocess = ">=0.5"
 name = "pickleshare"
 version = "0.7.5"
 description = "Tiny 'shelve'-like database with concurrency support"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -1880,7 +1808,6 @@ files = [
 name = "pillow"
 version = "9.5.0"
 description = "Python Imaging Library (Fork)"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1960,7 +1887,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
 name = "pkgutil-resolve-name"
 version = "1.3.10"
 description = "Resolve a name to an object."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1972,7 +1898,6 @@ files = [
 name = "platformdirs"
 version = "3.8.0"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1988,7 +1913,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-
 name = "pluggy"
 version = "1.2.0"
 description = "plugin and hook calling mechanisms for python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2004,7 +1928,6 @@ testing = ["pytest", "pytest-benchmark"]
 name = "pre-commit"
 version = "3.3.3"
 description = "A framework for managing and maintaining multi-language pre-commit hooks."
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2023,7 +1946,6 @@ virtualenv = ">=20.10.0"
 name = "prometheus-client"
 version = "0.17.0"
 description = "Python client for the Prometheus monitoring system."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -2038,7 +1960,6 @@ twisted = ["twisted"]
 name = "prompt-toolkit"
 version = "3.0.38"
 description = "Library for building powerful interactive command lines in Python"
-category = "main"
 optional = true
 python-versions = ">=3.7.0"
 files = [
@@ -2053,7 +1974,6 @@ wcwidth = "*"
 name = "psutil"
 version = "5.9.5"
 description = "Cross-platform lib for process and system monitoring in Python."
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -2080,7 +2000,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
 name = "ptyprocess"
 version = "0.7.0"
 description = "Run a subprocess in a pseudo terminal"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2092,7 +2011,6 @@ files = [
 name = "pure-eval"
 version = "0.2.2"
 description = "Safely evaluate AST nodes without side effects"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2107,7 +2025,6 @@ tests = ["pytest"]
 name = "pycparser"
 version = "2.21"
 description = "C parser in Python"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -2119,7 +2036,6 @@ files = [
 name = "pygments"
 version = "2.15.1"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2134,7 +2050,6 @@ plugins = ["importlib-metadata"]
 name = "pyodbc"
 version = "4.0.39"
 description = "DB API Module for ODBC"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 files = [
@@ -2179,7 +2094,6 @@ files = [
 name = "pyparsing"
 version = "3.1.0"
 description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-category = "main"
 optional = true
 python-versions = ">=3.6.8"
 files = [
@@ -2194,7 +2108,6 @@ diagrams = ["jinja2", "railroad-diagrams"]
 name = "pyrsistent"
 version = "0.19.3"
 description = "Persistent/Functional/Immutable data structures"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2231,7 +2144,6 @@ files = [
 name = "pyspnego"
 version = "0.9.1"
 description = "Windows Negotiate Authentication Client and Server"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2262,7 +2174,6 @@ yaml = ["ruamel.yaml"]
 name = "pytest"
 version = "7.4.0"
 description = "pytest: simple powerful testing with Python"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2285,7 +2196,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 files = [
@@ -2300,7 +2210,6 @@ six = ">=1.5"
 name = "python-json-logger"
 version = "2.0.7"
 description = "A python library adding a json log formatter"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -2312,7 +2221,6 @@ files = [
 name = "pytz"
 version = "2023.3"
 description = "World timezone definitions, modern and historical"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -2324,7 +2232,6 @@ files = [
 name = "pywin32"
 version = "306"
 description = "Python for Window Extensions"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2348,7 +2255,6 @@ files = [
 name = "pywinpty"
 version = "2.0.10"
 description = "Pseudo terminal support for Windows from Python."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2364,7 +2270,6 @@ files = [
 name = "pyyaml"
 version = "6.0"
 description = "YAML parser and emitter for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -2414,7 +2319,6 @@ files = [
 name = "pyzmq"
 version = "25.1.0"
 description = "Python bindings for 0MQ"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -2504,7 +2408,6 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""}
 name = "qtconsole"
 version = "5.4.3"
 description = "Jupyter Qt console"
-category = "main"
 optional = true
 python-versions = ">= 3.7"
 files = [
@@ -2531,7 +2434,6 @@ test = ["flaky", "pytest", "pytest-qt"]
 name = "qtpy"
 version = "2.3.1"
 description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2549,7 +2451,6 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"]
 name = "requests"
 version = "2.31.0"
 description = "Python HTTP for Humans."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2571,7 +2472,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
 name = "requests-kerberos"
 version = "0.14.0"
 description = "A Kerberos authentication handler for python-requests"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -2588,7 +2488,6 @@ requests = ">=1.1.0"
 name = "rfc3339-validator"
 version = "0.1.4"
 description = "A pure python RFC3339 validator"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -2603,7 +2502,6 @@ six = "*"
 name = "rfc3986-validator"
 version = "0.1.1"
 description = "Pure python rfc3986 validator"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -2615,7 +2513,6 @@ files = [
 name = "send2trash"
 version = "1.8.2"
 description = "Send file to trash natively under Mac OS X, Windows and Linux"
-category = "main"
 optional = true
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 files = [
@@ -2632,7 +2529,6 @@ win32 = ["pywin32"]
 name = "setuptools"
 version = "68.0.0"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2649,7 +2545,6 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -2661,7 +2556,6 @@ files = [
 name = "sniffio"
 version = "1.3.0"
 description = "Sniff out which async library your code is running under"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2673,7 +2567,6 @@ files = [
 name = "soupsieve"
 version = "2.4.1"
 description = "A modern CSS selector implementation for Beautiful Soup."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2685,7 +2578,6 @@ files = [
 name = "stack-data"
 version = "0.6.2"
 description = "Extract data from python stack frames and tracebacks for informative displays"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2705,7 +2597,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
 name = "terminado"
 version = "0.17.1"
 description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2726,7 +2617,6 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"]
 name = "tinycss2"
 version = "1.2.1"
 description = "A tiny CSS parser"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2745,7 +2635,6 @@ test = ["flake8", "isort", "pytest"]
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2757,7 +2646,6 @@ files = [
 name = "tornado"
 version = "6.3.2"
 description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-category = "main"
 optional = true
 python-versions = ">= 3.8"
 files = [
@@ -2778,7 +2666,6 @@ files = [
 name = "traitlets"
 version = "5.9.0"
 description = "Traitlets Python configuration system"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2794,7 +2681,6 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"]
 name = "typing-extensions"
 version = "4.6.3"
 description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2806,7 +2692,6 @@ files = [
 name = "tzdata"
 version = "2023.3"
 description = "Provider of IANA time zone data"
-category = "main"
 optional = false
 python-versions = ">=2"
 files = [
@@ -2818,7 +2703,6 @@ files = [
 name = "uri-template"
 version = "1.3.0"
 description = "RFC 6570 URI Template Processor"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2833,7 +2717,6 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake
 name = "urllib3"
 version = "2.0.3"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2851,7 +2734,6 @@ zstd = ["zstandard (>=0.18.0)"]
 name = "virtualenv"
 version = "20.23.1"
 description = "Virtual Python Environment builder"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2872,7 +2754,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
 name = "wcwidth"
 version = "0.2.6"
 description = "Measures the displayed width of unicode strings in a terminal"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2884,7 +2765,6 @@ files = [
 name = "webcolors"
 version = "1.13"
 description = "A library for working with the color formats defined by HTML and CSS."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2900,7 +2780,6 @@ tests = ["pytest", "pytest-cov"]
 name = "webencodings"
 version = "0.5.1"
 description = "Character encoding aliases for legacy web content"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2912,7 +2791,6 @@ files = [
 name = "websocket-client"
 version = "1.6.1"
 description = "WebSocket client for Python with low level API options"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2929,7 +2807,6 @@ test = ["websockets"]
 name = "widgetsnbextension"
 version = "4.0.7"
 description = "Jupyter interactive widgets for Jupyter Notebook"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2941,7 +2818,6 @@ files = [
 name = "zipp"
 version = "3.15.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2959,4 +2835,4 @@ notebooks = ["jupyter", "matplotlib"]
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.8"
-content-hash = "f09a2c9f249bc436fc534d79fadd182b93f5f5c4130770f892c3b10c6908d880"
+content-hash = "d438b06cd3ff1cc8e892cd482f272baaf7b435dff984ffe629a5571c65ed8704"
diff --git a/pyproject.toml b/pyproject.toml
index 95ef9434..b9c6a1d0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -31,7 +31,8 @@ classifiers=[
 python = "^3.8"
 pandas = ">=1"
 pyodbc = "^4"
-certifi = "^2023"
+cryptography = "^41.0.3"
+certifi = "^2023.7.22"
 requests = "^2"
 requests-kerberos = "^0"
 jupyter = { version = "^1", optional = true }
diff --git a/tagreader/clients.py b/tagreader/clients.py
index 4145003c..a6b333b4 100644
--- a/tagreader/clients.py
+++ b/tagreader/clients.py
@@ -1,6 +1,6 @@
 import os
 import warnings
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, tzinfo
 from itertools import groupby
 from operator import itemgetter
 from pathlib import Path
@@ -303,7 +303,7 @@ def __init__(
         self,
         datasource: str,
         imstype: Optional[Union[str, IMSType]] = None,
-        tz: pytz.timezone = pytz.timezone("Europe/Oslo"),
+        tz: Union[tzinfo, str] = pytz.timezone("Europe/Oslo"),
         url: Optional[str] = None,
         host: Optional[str] = None,
         port: Optional[int] = None,
@@ -321,7 +321,18 @@ def __init__(
                     f" We suggest to use the tagreader.IMSType enumerator when initiating a client."
                 )
 
-        self.tz = tz
+        if isinstance(tz, str):
+            if tz in pytz.all_timezones:
+                self.tz = pytz.timezone(tz)
+            else:
+                raise ValueError(f"Invalid timezone string  Given type was {type(tz)}")
+        elif isinstance(tz, tzinfo):
+            self.tz = tz
+        else:
+            raise ValueError(
+                f"timezone argument 'tz' needs to be either a valid timezone string or a tzinfo-object. Given type was {type(tz)}"
+            )
+
         self.handler = get_handler(
             imstype=imstype,
             datasource=datasource,
diff --git a/tagreader/utils.py b/tagreader/utils.py
index 52e4ec61..da553377 100644
--- a/tagreader/utils.py
+++ b/tagreader/utils.py
@@ -2,7 +2,7 @@
 import logging
 import platform
 import warnings
-from datetime import datetime
+from datetime import datetime, tzinfo
 from enum import Enum
 from typing import Union
 
@@ -82,7 +82,7 @@ def convert_to_pydatetime(date_stamp: Union[datetime, str, pd.Timestamp]) -> dat
 
 def ensure_datetime_with_tz(
     date_stamp: Union[datetime, str, pd.Timestamp],
-    tz: pytz.timezone = pytz.timezone("Europe/Oslo"),
+    tz: tzinfo = pytz.timezone("Europe/Oslo"),
 ) -> datetime:
     date_stamp = convert_to_pydatetime(date_stamp)
 


Test patch:
diff --git a/tests/test_clients.py b/tests/test_clients.py
index 223af5c1..dcfdc681 100644
--- a/tests/test_clients.py
+++ b/tests/test_clients.py
@@ -3,6 +3,7 @@
 
 import pandas as pd
 import pytest
+import pytz
 
 from tagreader.cache import SmartCache
 from tagreader.clients import IMSClient, get_missing_intervals, get_next_timeslice
@@ -28,6 +29,71 @@ def test_init_client_without_cache() -> None:
     assert isinstance(client.handler, PIHandlerWeb)  # Based on IMSType.PIWEBAPI
 
 
+def test_init_client_with_tzinfo() -> None:
+    """
+    Currently testing valid timezone
+    """
+    client = IMSClient(
+        datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="US/Eastern"
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("US/Eastern")
+
+    client = IMSClient(
+        datasource="mock",
+        imstype=IMSType.PIWEBAPI,
+        cache=None,
+        tz=pytz.timezone("US/Eastern"),
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("US/Eastern")
+
+    client = IMSClient(
+        datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="Europe/Oslo"
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("Europe/Oslo")
+
+    client = IMSClient(
+        datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="US/Central"
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("US/Central")
+
+    client = IMSClient(datasource="mock", imstype=IMSType.PIWEBAPI, cache=None)
+    print(client.tz)
+    assert client.tz == pytz.timezone("Europe/Oslo")
+
+    with pytest.raises(ValueError):
+        _ = IMSClient(
+            datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="WRONGVALUE"
+        )
+
+
+def test_init_client_with_datasource() -> None:
+    """
+    Currently we initialize SmartCache by default, and the user is not able to specify no-cache when creating the
+    client. This will change to no cache by default in version 5.
+    """
+    client = IMSClient(
+        datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="US/Eastern"
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("US/Eastern")
+    client = IMSClient(
+        datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="US/Central"
+    )
+    print(client.tz)
+    assert client.tz == pytz.timezone("US/Central")
+    client = IMSClient(datasource="mock", imstype=IMSType.PIWEBAPI, cache=None)
+    print(client.tz)
+    assert client.tz == pytz.timezone("Europe/Oslo")
+    with pytest.raises(ValueError):
+        _ = IMSClient(
+            datasource="mock", imstype=IMSType.PIWEBAPI, cache=None, tz="WRONGVALUE"
+        )
+
+
 def test_get_next_timeslice() -> None:
     start = pd.to_datetime("2018-01-02 14:00:00")
     end = pd.to_datetime("2018-01-02 14:15:00")
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 1b4c7e44..6ce84091 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -15,25 +15,21 @@ def test_ensure_is_datetime_string() -> None:
     assert ensure_datetime_with_tz("10. jan. 2018 13:45:15") == timezone(
         "Europe/Oslo"
     ).localize(datetime.datetime(2018, 1, 10, 13, 45, 15))
-    assert ensure_datetime_with_tz("02.01.03 00:00:00") == timezone(
+    assert ensure_datetime_with_tz("01.02.03 00:00:00") == timezone(
         "Europe/Oslo"
-    ).localize(datetime.datetime(2003, 1, 2, 0, 0, 0))
+    ).localize(datetime.datetime(2003, 2, 1, 0, 0, 0))
     assert ensure_datetime_with_tz("02.01.03 00:00:00") == ensure_datetime_with_tz(
         "2003-02-01 0:00:00am"
     )
     assert ensure_datetime_with_tz(
-        pd.to_datetime("02.01.03 00:00:00", dayfirst=True)
-        .tz_localize(pytz.timezone("America/Sao_Paulo"))
-        .to_pydatetime()
+        "02.01.03 00:00:00", pytz.timezone("America/Sao_Paulo")
     ) == timezone("America/Sao_Paulo").localize(datetime.datetime(2003, 1, 2, 0, 0, 0))
     assert ensure_datetime_with_tz(
-        pd.to_datetime("02.01.03 00:00:00", dayfirst=True)
-        .tz_localize(pytz.timezone("America/Sao_Paulo"))
-        .to_pydatetime()
+        "02.01.03 00:00:00", pytz.timezone("Brazil/East")
     ) == timezone("Brazil/East").localize(datetime.datetime(2003, 1, 2, 0, 0, 0))
     assert ensure_datetime_with_tz(
         timezone("Brazil/East").localize(datetime.datetime(2003, 1, 2, 0, 0, 0)),
-        tz="Europe/Oslo",
+        pytz.timezone("Brazil/East"),
     ) == timezone("Brazil/East").localize(datetime.datetime(2003, 1, 2, 0, 0, 0))