Pandas timestamp в и из JSON - PullRequest
       3

Pandas timestamp в и из JSON

1 голос
/ 17 марта 2019

Объекты нельзя сериализовать в json, поэтому их необходимо конвертировать или анализировать с помощью пользовательского класса JsonEncoder.

pandas Dataframe имеет несколько методов, таких как from_records для чтения данных json. Тем не менее, когда вы читаете эти данные json обратно, они возвращаются как int64, а не как отметка времени.

Есть много способов обнажить кошку в пандах. Каков наилучший способ сохранить структуры данных при чтении и записи json?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Для чего стоит сохранять кадры данных pandas в базе данных 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
0 голосов
/ 18 марта 2019

Если я правильно понял вашу проблему, вы ищете способ сериализации, сохраняющий типы данных фрейма данных.

Проблема заключается в том, что форматы interchange внутренне используют несколько типов:только строки для CSV, строки и числа для JSON.Конечно, есть способы дать подсказки по форматированию во время чтения (формат даты для столбцов даты в csv), и, как правило, легко преобразовать обратно в правильный тип после извлечения, я думаю, что вы надеетесь на более естественное способ.Как рекомендует Attack68, вы можете использовать базу данных, но, например, база данных SQLite будет отключена, поскольку у нее нет внутреннего типа даты.

ИМХО, простой способ - полагаться на старый добрый модуль pickle.В конце концов, фрейм данных - это объект Python, который содержит другие объекты Python, так что pickle хорош в сериализации.Единственное, что нужно помнить, это то, что во время десериализации панды нужно будет импортировать перед вызовом pickle.load.

Но я только что протестировал (крошечный) фрейм данных, содержащий различные типы данных, и pickle был великолепен какправильно сохранять и восстанавливать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...