【发布时间】: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