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 文档。
感谢 @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)
| 归档时间: |
|
| 查看次数: |
15778 次 |
| 最近记录: |