对象不能序列化为json,因此需要通过自定义JsonEncoder类进行转换或解析。
熊猫数据有很多种方法,比如from_records
来读取json数据。然而,当您读取回json数据时,返回的是int64,而不是时间戳。
在熊猫身上剥猫皮有很多种方法。在读取和写入json时,保存数据结构的最佳方法是什么?
发布于 2019-03-18 06:12:32
为了它的价值,我把熊猫的数据保存到一个Postgres数据库,我想保留时间范围的索引。我使用以下代码:
class db_JsonEncodedDataFrameWithTimezone(db.TypeDecorator):
"""Enables JSON storage by encoding and decoding on the fly."""
impl = db.Text
def process_bind_param(self, value, dialect):
if value is not None and isinstance(value, pd.DataFrame):
timezone = value.index.tz.zone
df_json = value.to_json(orient="index")
data = {'timezone': timezone, 'df': df_json, 'index_name': value.index.name}
value = json.dumps(data)
return value
def process_result_value(self, value, dialect):
if value is not None:
data = json.loads(value)
df = pd.read_json(data['df'], orient="index")
df.index = df.index.tz_localize('UTC')
df.index = df.index.tz_convert(data['timezone'])
df.index.name = data['index_name']
value = df
return value
def compare_values(self, x, y):
from pandas.util.testing import assert_frame_equal
try:
assert_frame_equal(x, y, check_names=True, check_like=True)
return True
except (AssertionError, ValueError, TypeError):
return False
发布于 2019-03-18 08:11:34
如果我正确地理解了您的问题,那么您正在寻找一种序列化方法,以保留dataframe的数据类型。
问题是交换格式内部使用几种类型:仅用于csv的字符串,用于json的字符串和数字。当然,有一些方法可以在读取时间给出格式化提示(csv中日期列的日期格式),而且提取后通常很容易转换回正确的类型,我认为您会希望采用一种更自然的方法。正如Attack68建议的那样,您可以使用数据库,但例如,SQLite数据库将关闭,因为它没有内部日期类型。
IMHO一种简单的方法是依赖好的旧pickle
模块。毕竟,dataframe是一个包含其他Python对象的Python对象,所以泡菜很擅长序列化它。唯一要记住的一点是,在反序列化的时候,熊猫必须在调用pickle.load
之前被进口。
但是我刚刚用一个包含各种数据类型的(微小的)数据文件进行了测试,泡菜对于正确地保存和恢复它们是很棒的。
https://stackoverflow.com/questions/55205436
复制