将日期时间与 Pyarrow 一起使用时出现溢出错误
overflow error using datetimes with Pyarrow
在随机化日期时间以测试数据库时,我使用 pyarrow.parquets' write_table()
将它们保存到 parquet,然后使用 read_table()
读回它们。
尝试使用 to_pydict()
转换为 Python 数据类型时,我收到以下错误:
---> 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 的新手,这是预期的行为吗?
这里的根本问题是 Pandas 表示自 1970 年以来的纳秒日期时间。2700 年左右的时间只是 nanoseconds-since-1970
的数量超过 space 可以用 int64
.
表示
在 Arrow 中,您可以使用 milliseconds-since-1970
等更细粒度的表示来表示这些日期,但在转换为 Pandas 时,它们总是被转换为 nanoseconds-since-1970
,因此这个日期无法在 Pandas.
中表示
在随机化日期时间以测试数据库时,我使用 pyarrow.parquets' write_table()
将它们保存到 parquet,然后使用 read_table()
读回它们。
尝试使用 to_pydict()
转换为 Python 数据类型时,我收到以下错误:
---> 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 的新手,这是预期的行为吗?
这里的根本问题是 Pandas 表示自 1970 年以来的纳秒日期时间。2700 年左右的时间只是 nanoseconds-since-1970
的数量超过 space 可以用 int64
.
在 Arrow 中,您可以使用 milliseconds-since-1970
等更细粒度的表示来表示这些日期,但在转换为 Pandas 时,它们总是被转换为 nanoseconds-since-1970
,因此这个日期无法在 Pandas.