【问题标题】:Dask OutOfBoundsDatetime when reading parquet files读取镶木地板文件时 Dask OutOfBoundsDatetime
【发布时间】:2021-08-10 12:39:36
【问题描述】:

以下代码失败

pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: -221047-10-07 10:43:35

from pathlib import Path

import dask.dataframe as dd
import numpy as np
import pandas as pd
import tempfile


def run():
    temp_folder = tempfile.TemporaryDirectory()
    rng = np.random.default_rng(42)
    filenames = []
    for i in range(2):
        filename = Path(temp_folder.name, f"file_{i}.gzip")
        filenames.append(filename)
        df = pd.DataFrame(
            data=rng.normal(size=(365, 1500)),
            index=pd.date_range(
                start="2021-01-01",
                end="2022-01-01",
                closed="left",
                freq="D",
            ),
        )
        df.columns = df.columns.astype(str)
        df.to_parquet(filename, compression="gzip")
    df = dd.read_parquet(filenames)
    result = df.mean().mean().compute()
    temp_folder.cleanup()
    return result


if __name__ == "__main__":
    run()

为什么这个(示例)代码会失败?

我正在尝试做的事情: 该循环类似于批量创建大于内存的数据。 在下一步中,我想从文件中读取该数据并在 dask 中使用它。

观察:

如果我只读取一个文件

for i in range(1):

代码正在运行。

如果我不使用 DateTimeIndex

df = pd.DataFrame(
            data=rng.normal(size=(365, 1500)),
        )

代码正在运行。

如果我只使用熊猫

df = pd.read_parquet(filenames)
result = df.mean().mean()

代码正在运行。 (这很奇怪,因为read_parquet in pandas only expects one path not a collection

如果我使用distributed client with concat as suggested here,我会收到类似的错误pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 68024-12-20 01:46:56 因此,我在示例中省略了客户端。

【问题讨论】:

  • 请提供您正在使用的 parquet 引擎(pyarrow 或 fastparquet)和版本
  • @mdurant 我在依赖项中看到了 fastparquet 0.7.1 和 pyarrow 3.0.0(通过其他包)。也许 pandas 和 dask 正在使用不兼容的版本?我会在一个新的环境中尝试。谢谢。
  • 请在您的 parquet 命令中明确提供 engine=,因为我瘦 pandas 和 dask 有不同的默认值。
  • @mdurant 谢谢。提供引擎有帮助。我暂时已经回答了我自己的问题。如果您想自己提供答案,我很乐意接受它作为解决方案并删除我的。

标签: python pandas datetime dask parquet


【解决方案1】:

感谢@mdurant 的有用评论,提供引擎帮助:

engine='fastparquet'  # or 'pyarrow'
df.to_parquet(filename, compression="gzip", engine=engine)
df = dd.read_parquet(filenames, engine=engine)

当安装了多个 parquet 引擎时,显然 engine='auto' 在 dask 和 pandas 中会选择不同的引擎。

旁注: 我尝试了不同的引擎组合,这会触发问题中的错误:

df.to_parquet(filename, compression="gzip", engine='pyarrow')
df = dd.read_parquet(filenames, engine='fastparquet')

【讨论】:

  • 失败可能是 fastparquet 错误 - 请提出问题。
猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 2019-08-04
  • 2022-06-16
  • 2021-03-19
  • 2019-09-23
相关资源
最近更新 更多