我有一个时间戳9999-12-31 23:59:59
以 int96 形式存储在 parquet 文件中。我使用 pyarrow.dataset 读取此镶木地板文件,并将结果表转换为 pandas 数据框(使用 pyarrow.Table.to_pandas())。转换为 pandas 数据帧将我的时间戳变成1816-03-30 05:56:07.066277376
(Pandas 时间戳的有效日期范围可能较小),没有任何关于数据类型或任何内容的抱怨。
然后,我获取这个 pandas 数据框,将其转换回表并使用 pyarrow.dataset.write_dataset 将其写入镶木地板数据集
我现在得到的数据与开始时的数据不同,没有看到任何警告。 (当我尝试从 parquet 数据集创建 impala 表但无法正确查询它时,我发现了这一点)。
从 pyarrow 表转换为 pandas 时,有没有办法处理这些大时间戳?
我尝试过使用timestamp_as_object = True
参数如Table.to_pandas(timestamp_as_object = True)
,但似乎没有做任何事情。
EDIT:提供可重现的示例。问题是 pyarrow 在读取文件时认为时间戳是纳秒,尽管它们存储为微秒:
import pyarrow as pa
import pyarrow.dataset as ds
non_legacy_hdfs_filesystem = # connect to a filesystem here
my_table = pa.Table.from_arrays([pa.array(['9999-12-31', '9999-12-31', '9999-12-31']).cast('timestamp[us]')], names = ['my_timestamps'])
parquet_format = ds.ParquetFileFormat()
write_options = parquet_format.make_write_options(use_deprecated_int96_timestamps = True, coerce_timestamps = 'us', allow_truncated_timestamps = True)
ds.write_dataset(data = my_table, base_dir = 'my_path', filesystem = non_legacy_hdfs_filesystem, format = parquet_format, file_options = write_options, partitioning= None)
dataset = ds.dataset('my_path', filesystem = non_legacy_hdfs_filesystem)
dataset.to_table().column('my_timestamps')