使用python和pandas传输和编写Parquet得到时间戳错误

Nei*_* Su 21 python pandas parquet

我试图在 python 中使用熊猫 concat() 两个镶木地板文件。
它可以工作,但是当我尝试将数据框写入并保存到镶木地板文件时,它显示错误:

 ArrowInvalid: Casting from timestamp[ns] to timestamp[ms] would lose data:
Run Code Online (Sandbox Code Playgroud)

我检查了文档。的熊猫,它在写入镶木地板文件时默认以毫秒为单位的时间戳语法。
连接后如何使用使用过的模式将镶木地板文件变白?
这是我的代码:

import pandas as pd

table1 = pd.read_parquet(path= ('path.parquet'),engine='pyarrow')
table2 = pd.read_parquet(path= ('path.parquet'),engine='pyarrow')

table = pd.concat([table1, table2], ignore_index=True) 
table.to_parquet('./file.gzip', compression='gzip')
Run Code Online (Sandbox Code Playgroud)

Axe*_*xel 25

Pandas 至少从v0.22. 因此,使用table.to_parquet(allow_truncated_timestamps=True)应该有效 - 我为 pandasv0.25.0和 pyarrow验证了它0.13.0。有关更多关键字,请参阅pyarrow 文档

  • 只是更新 - 对我来说,连同此选项还必须设置 coerce_timestamps ='ms' (2认同)

Max*_*axU 9

感谢 @axel 提供Apache Arrow 文档链接

allow_truncated_timestamps (bool, default False) – 将时间戳强制转换为特定分辨率时允许丢失数据。例如,如果在强制转换为 'ms' 时丢失了微秒或纳秒数据,则不要引发异常。

似乎在现代 Pandas 版本中,我们可以将参数传递给ParquetWriter.

以下代码适合我(Pandas 1.1.1,PyArrow 1.0.1):

df.to_parquet(filename, use_deprecated_int96_timestamps=True)
Run Code Online (Sandbox Code Playgroud)


小智 5

我认为这是一个错误,你应该按照韦斯说的去做。但是,如果您现在需要工作代码,我有一个解决方法。

对我有用的解决方案是将时间戳列指定为毫秒精度。如果您需要纳秒级精度,这将破坏您的数据……但如果是这种情况,这可能是您的问题中最少的。

import pandas as pd

table1 = pd.read_parquet(path=('path1.parquet'))
table2 = pd.read_parquet(path=('path2.parquet'))

table1["Date"] = table1["Date"].astype("datetime64[ms]")
table2["Date"] = table2["Date"].astype("datetime64[ms]")

table = pd.concat([table1, table2], ignore_index=True) 
table.to_parquet('./file.gzip', compression='gzip')
Run Code Online (Sandbox Code Playgroud)

  • 这个`table1["Date"].astype("datetime64[ms]")`不起作用,仍然有`datetime64[ns]`。熊猫0.24.2 (2认同)