Вопрос или проблема
Я хочу прочитать в 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.
Шаги по решению
-
Проверьте формат JSON: Сначала убедитесь, что данные в JSON действительно имеют правильный формат. Вы можете распечатать JSON, который будет передан в
pl.read_json
.print(df.write_json())
-
Преобразование строк в даты: Если вы хотите, чтобы
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)
Объяснение кода
-
Создание DataFrame: Мы создаем
DataFrame
с датами в строковом формате. Для этого мы используем стандартный методstrftime
для форматирования дат. -
Чтение JSON: Используется
StringIO
для передачи JSON вpl.read_json
. Вместо явного указания схемы, мы сначала загружаем данные в их исходном виде. -
Преобразование строк в даты: После загрузки мы используем метод
str.strptime()
для преобразования строкового представления даты в типpl.Date
, при этом указываем формат ("yyyy-mm-dd").
Заключение
Теперь у вас есть рабочее решение для корректного чтения дат из JSON с использованием Polars
. Проблема, о которой вы сообщали, связана с процессом парсинга типов данных, и правильный подход — это сначала загрузить данные, а затем явно преобразовать типы по мере необходимости. Это гарантирует, что все строки дат будут успешно преобразованы в даты без значений NULL.
Если у вас возникнут дополнительные вопросы или вам понадобится помощь с другими аспектами использования Polars
, не стесняйтесь обращаться за помощью.