This error occurs when you try to serialize a pandas Timestamp object to a JSON string using the json.dumps() method. You can solve this error by converting the Timestamp to a string using the build in str() method. For example,
import json
import pandas as pd
timestamp = pd.Timestamp('2011-05-19T13')
json_str = json.dumps(str(timestamp))
This tutorial will go through how to solve the error with code examples.
Table of contents
TypeError: Object of type Timestamp is not JSON serializable
Let’s break up the error message to understand what the error means. TypeError occurs whenever you attempt to use an illegal operation for a specific data type. The part “Object of type Timestamp” tells us the error is due to an illegal operation with a map object.
Serialization in Python refers to converting a Python object into a transmittable format that we can recreate when needed using deserialization. JSON serialization returns a human-readable string form called a JSON string. The JSON encoder json.dump() and json.dumps() can only serialize certain object types like dictionaries, lists, or strings.
“is not JSON serializable” informs us that the JSON serialization is an illegal operation for the Timestamp type.
Example
Let’s look at an example of serializing of a Timestamp object. The Timestamp is the pandas equivalent of Python’s built-in Datetime. First, we will create a Pandas DataFrame with two columns, one for a date and one for a random number. The dates will occupy a range of five days.
import pandas as pd
import numpy as np
np.random.seed(0)
rng = pd.date_range('2021-01-13', periods=5, freq='D')
df = pd.DataFrame({ 'Date': rng, 'Val': np.random.randn(len(rng)) })
print(df)
Date Val 0 2021-01-13 1.764052 1 2021-01-14 0.400157 2 2021-01-15 0.978738 3 2021-01-16 2.240893 4 2021-01-17 1.867558
Next, we will create variable containing the Date column, then select the first date and attempt to serialize it to a JSON string using the json.dumps() method.
import json dates = df.Date first_date = dates[0] json_str = json.dumps(first_date) print(json_str)
Let’s run the code to see what happens:
TypeError: Object of type Timestamp is not JSON serializable
The error occurs because first_date is a Timestamp object and the json.dumps() method does not handle Timestamp objects by default.
Solution #1: Convert Timestamp to string using str()
The simplest way to solve this error is to convert the Timestamp object to a string using the built-in str() method. The json.dumps() method handles string objects. Let’s look at the revised code:
import json dates = df.Date first_date = str(dates[0]) json_str = json.dumps(first_date) print(json_str)
Let’s run the code to get the JSON string:
"2021-01-13 00:00:00"
Solution #2: Set default argument to str
We can also solve this error by setting the default argument of json.dumps() to str. The function we set default to gets called for objects that are not JSON serializable. In this case we can pass the Timestamp object directly to the json.dumps() method.
Let’s look at the revised code:
import json dates = df.Date first_date = dates[0] json_str = json.dumps(first_date, default=str) print(json_str)
Let’s run the code to see the JSON string:
"2021-01-13 00:00:00"
Solution #3: Define a JSONEncoder subclass for the cls kwarg
We can also solve this error by building a custom JSONEncoder subclass. This subclass will override the default method to serialize additional types.
import json
import pandas as pd
class timestamp_encoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, pd.Timestamp):
return str(obj)
return json.JSONEncoder.default(self, obj)
Similar to the custom function, the default method of the timestamp_encoder class checks if the object is of type Timestamp, converts it to a string and returns it.
We have to specify the custom JSONEncoder subclass with the cls keyword argument. Otherwise, JSONEncoder is used. Let’s look at the updated code:
import json dates = df.Date first_date = dates[0] json_str = json.dumps(first_date, cls=timestamp_encoder) print(json_str)
Let’s run the code to get the JSON string.
"2021-01-13 00:00:00"
Below is the collection of objects that the JSONEncoder class supports by default and their JSON equivalent.
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float, int- & float- derived Enums | number |
| True | true |
| False | false |
| None | null |
Summary
Congratulations on reading to the end of this tutorial.
For further reading on errors involving JSON serialization, go to the articles:
- How to Solve Python TypeError: Object of type int32 is not JSON serializable
- How to Solve Python TypeError: Object of type Decimal is not JSON serializable
- How to Solve Python TypeError: Object of type DataFrame is not JSON serializable
Go to the online courses page on Python to learn more about Python for data science and machine learning.
Have fun and happy researching!
Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.
