polars (python-api): read_json не удается разобрать дату

Вопрос или проблема

Я хочу прочитать в DataFrame Polars из строки json, содержащей даты в стандартном формате iso “yyyy-mm-dd”. Когда я пытаюсь прочитать строку и установить тип данных для столбца даты с помощью schema или schema_override, это приводит только к значению NULL.

Минимальный воспроизводимый пример

from datetime import datetime, timedelta
from io import StringIO

import polars as pl

# Генерируем список дат
start_date = datetime.today()
dates = [start_date + timedelta(days=i) for i in range(100)]
date_strings = [date.strftime("%Y-%m-%d") for date in dates]

# Создаем DataFrame Polars
df = pl.DataFrame({"dates": date_strings})

df_reread = pl.read_json(
    StringIO(df.write_json()),
    schema_overrides={"dates": pl.Date},
)

вывод print(df_reread)

Ошибка

shape: (100, 1)
┌───────┐
│ dates │
│ ---   │
│ date  │
╞═══════╡
│ null  │
│ null  │
│ null  │
│ null  │
│ null  │
│ …     │
│ null  │
│ null  │
│ null  │
│ null  │
│ null  │
└───────┘

Вопрос

Существует ли способ правильно считать тип Date из строки json?

Ответ или решение

Решение проблемы чтения дат с использованием Polars в Python

Ваша проблема с Polars и чтением JSON-строки, содержащей даты в стандартном ISO-формате ("yyyy-mm-dd"), заключается в неправильном определении типа данных для столбца дат. Давайте разберем вашу исходную проблему и предложим правильное решение.

Проблема

Вы пытаетесь загрузить данные с помощью функции pl.read_json, устанавливая тип данных столбца "dates" в pl.Date, однако получаете только значения NULL. Это часто связано с тем, как Polars обрабатывает типы данных при парсинге JSON.

Шаги по решению

  1. Проверьте формат JSON: Сначала убедитесь, что данные в JSON действительно имеют правильный формат. Вы можете распечатать JSON, который будет передан в pl.read_json.

    print(df.write_json())
  2. Преобразование строк в даты: Если вы хотите, чтобы Polars правильно интерпретировал даты, вы можете сначала загрузить JSON без указания схемы, а затем преобразовать столбец с датами в нужный формат.

    import polars as pl
    from datetime import datetime, timedelta
    from io import StringIO
    
    # Генерация списка дат
    start_date = datetime.today()
    dates = [start_date + timedelta(days=i) for i in range(100)]
    date_strings = [date.strftime("%Y-%m-%d") for date in dates]
    
    # Создание DataFrame Polars
    df = pl.DataFrame({"dates": date_strings})
    
    # Чтение JSON без указания схемы
    df_reread = pl.read_json(StringIO(df.write_json()))
    
    # Преобразование столбца "dates" в тип Date
    df_reread = df_reread.with_columns(pl.col("dates").str.strptime(pl.Date, "%Y-%m-%d"))
    
    print(df_reread)

Объяснение кода

  1. Создание DataFrame: Мы создаем DataFrame с датами в строковом формате. Для этого мы используем стандартный метод strftime для форматирования дат.

  2. Чтение JSON: Используется StringIO для передачи JSON в pl.read_json. Вместо явного указания схемы, мы сначала загружаем данные в их исходном виде.

  3. Преобразование строк в даты: После загрузки мы используем метод str.strptime() для преобразования строкового представления даты в тип pl.Date, при этом указываем формат ("yyyy-mm-dd").

Заключение

Теперь у вас есть рабочее решение для корректного чтения дат из JSON с использованием Polars. Проблема, о которой вы сообщали, связана с процессом парсинга типов данных, и правильный подход — это сначала загрузить данные, а затем явно преобразовать типы по мере необходимости. Это гарантирует, что все строки дат будут успешно преобразованы в даты без значений NULL.

Если у вас возникнут дополнительные вопросы или вам понадобится помощь с другими аспектами использования Polars, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...