往返于JSON的熊猫时间戳

时间:2019-03-17 09:02:16

标签: python json pandas numpy

对象无法序列化为json,因此需要通过自定义JsonEncoder类进行转换或解析。

pandas Dataframe有多种方法,例如from_records来读取json数据。但是,当您读回json数据时,它会返回int64而不是时间戳。

有很多方法可以在大熊猫中给猫皮剥皮。读写json时保留数据结构的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我将熊猫数据帧保存到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

答案 1 :(得分:0)

如果我正确理解了您的问题,那么您正在寻找一种保留数据帧数据类型的序列化方法。

问题是 interchange 格式在内部使用几种类型:仅用于csv的字符串,用于json的字符串和数字。当然,有一些方法可以在读取时给出格式提示(csv中日期列的日期格式),并且提取后通常很容易转换回适当的类型,因为我希望您能更自然方式。根据Attack68的建议,您可以使用数据库,但是例如,由于没有内部日期类型,因此SQLite数据库将关闭。

恕我直言,一种简单的方法是依靠良好的旧pickle模块。毕竟,数据框是一个包含其他Python对象的Python对象,因此pickle擅长将其序列化。唯一要记住的一点是,在反序列化时,必须在调用pickle.load之前导入熊猫。

但是我刚刚对包含各种数据类型的(微小)数据帧进行了测试,而pickle非常适合正确地保存和恢复它们。