python - 将带有时间增量的 Pandas 数据框写入 Parquet

标签 python pandas parquet pyarrow

我似乎无法通过 pyarrow 将包含 timedeltas 的 pandas 数据帧写入 parquet 文件。

pyarrow 文档指定它可以处理具有 ms 精度的 numpy timedeltas64。但是,当我从 numpy 的 timedelta64[ms] 构建数据帧时,该列的数据类型是 timedelta64[ns]

Pyarrow 会因此抛出错误。

这是 pandas 或 pyarrow 中的错误吗?有解决此问题的简单方法吗?

以下代码:

df = pd.DataFrame({
    'timedelta': np.arange(start=0, stop=1000,
        step=10,
         dtype='timedelta64[ms]')
})

print(df.timedelta.dtypes)

df.to_parquet('test.parquet', engine='pyarrow', compression='gzip')

产生以下输出:timedelta64[ns] 和错误:

---------------------------------------------------------------------------
ArrowNotImplementedError                  Traceback (most recent call last)
<ipython-input-41-7df28b306c1e> in <module>()
      3                                    step=10,
      4                                    dtype='timedelta64[ms]')
----> 5             }).to_parquet('test.parquet', engine='pyarrow', compression='gzip')

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pandas/core/frame.py in to_parquet(self, fname, engine, compression, **kwargs)
   1940         from pandas.io.parquet import to_parquet
   1941         to_parquet(self, fname, engine,
-> 1942                    compression=compression, **kwargs)
   1943 
   1944     @Substitution(header='Write out the column names. If a list of strings '

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pandas/io/parquet.py in to_parquet(df, path, engine, compression, **kwargs)
    255     """
    256     impl = get_engine(engine)
--> 257     return impl.write(df, path, compression=compression, **kwargs)
    258 
    259 

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pandas/io/parquet.py in write(self, df, path, compression, coerce_timestamps, **kwargs)
    116 
    117         else:
--> 118             table = self.api.Table.from_pandas(df)
    119             self.api.parquet.write_table(
    120                 table, path, compression=compression,

table.pxi in pyarrow.lib.Table.from_pandas()

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pyarrow/pandas_compat.py in dataframe_to_arrays(df, schema, preserve_index, nthreads)
    369         arrays = [convert_column(c, t)
    370                   for c, t in zip(columns_to_convert,
--> 371                                   convert_types)]
    372     else:
    373         from concurrent import futures

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pyarrow/pandas_compat.py in <listcomp>(.0)
    368     if nthreads == 1:
    369         arrays = [convert_column(c, t)
--> 370                   for c, t in zip(columns_to_convert,
    371                                   convert_types)]
    372     else:

~/miniconda3/envs/myenv/lib/python3.6/site-packages/pyarrow/pandas_compat.py in convert_column(col, ty)
    364 
    365     def convert_column(col, ty):
--> 366         return pa.array(col, from_pandas=True, type=ty)
    367 
    368     if nthreads == 1:

array.pxi in pyarrow.lib.array()

array.pxi in pyarrow.lib._ndarray_to_array()

error.pxi in pyarrow.lib.check_status()

ArrowNotImplementedError: Unsupported numpy type 22

最佳答案

fastparquet支持timedelta类型。

第一个install fastparquet,例如:

pip install fastparquet

然后你可以使用这个:

df.to_parquet('test.parquet.gzip', engine='fastparquet', compression='gzip')

关于python - 将带有时间增量的 Pandas 数据框写入 Parquet ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331721/

相关文章:

hadoop - OCR/Parquet文件的存储策略

python - 如何从 python 中执行 SQLite 脚本?

Python:如何打印在不同行上包含多个单词的字符串?

pandas - 将 geojson 文件下载到 jupyter 中的 folium 中

apache-spark - 以 parquet 格式存储 Spark 数据帧时丢失数据

amazon-web-services - s3 桶的默认 block 大小是多少

python >=3.5 : Checking type annotation at runtime

python - 当密码不正确时,如何让 rdpy-rdpmitm 让客户端重新输入用户名和密码

python - 如何打印给定特征的类别出现次数?

python - 按字典值过滤数据框,但有时包括值,有时排除它们