Ошибка переполнения при использовании datetime с Pyarrow
При рандомизации даты и времени для проверки базы данных я сохранил их в паркет, используя pyarrow.parquets ' write_table()
, а затем прочитать их обратно, используя read_table()
,
При попытке преобразовать в типы данных Python с to_pydict()
Я получил следующую ошибку:
---> 81 from_parquet = pq.read_table('parquet_vs_csv').to_pydict()
82
83 '''
pyarrow/table.pxi in pyarrow.lib.Table.to_pydict (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:38283)()
pyarrow/table.pxi in pyarrow.lib.Column.to_pylist (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:31782)()
pyarrow/table.pxi in pyarrow.lib.ChunkedArray.to_pylist (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:30410)()
pyarrow/array.pxi in __iter__ (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:25015)()
pyarrow/scalar.pxi in pyarrow.lib.TimestampValue.as_py (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:21082)()
pyarrow/scalar.pxi in pyarrow.lib.lambda5 (/arrow/python/build/temp.linux-x86_64-2.7/lib.cxx:7234)()
pandas/_libs/tslib.pyx in pandas._libs.tslib.Timestamp.__new__ (pandas/_libs/tslib.c:10051)()
pandas/_libs/tslib.pyx in pandas._libs.tslib.convert_to_tsobject (pandas/_libs/tslib.c:27665)()
OverflowError: Python int too large to convert to C long
Я играл по кругу, и это случается с датами, когда год больше 2700 или около того (это было на работе, а это большее число, забыл точное, которое было ниже).
Я новичок в Pyarrow, это ожидаемое поведение?
1 ответ
Основная проблема здесь заключается в том, что Pandas представляет дату-время с наносекундами с 1970 года. Время вокруг 2700 года - это просто ограничение того, что число nanoseconds-since-1970
превышает пространство, которое может быть представлено с int64
,
В Arrow вы можете представить эти даты, используя более детальное представление, например milliseconds-since-1970
но при обращении в панд они всегда приводятся к nanoseconds-since-1970
и, таким образом, эта дата не может быть представлена в пандах.