[英]Dask OutOfBoundsDatetime when reading parquet files
以下代碼失敗
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()
為什么此(示例)代碼會失敗?
我想做什么:循環類似於批量創建大於 memory 的數據。 在下一步中,我想從文件中讀取該數據並在 dask 中使用它。
觀察:
如果我只讀一個文件
for i in range(1):
代碼正在運行。
如果我不使用 DateTimeIndex
df = pd.DataFrame(
data=rng.normal(size=(365, 1500)),
)
代碼正在運行。
如果我只使用 pandas
df = pd.read_parquet(filenames)
result = df.mean().mean()
代碼正在運行。 (這很奇怪,因為pandas 中的 read_parquet 只需要一個路徑而不是一個集合)
如果我按照此處的建議將分布式客戶端與 concat 一起使用,我會收到類似的錯誤pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 68024-12-20 01:46:56
因此我在示例中省略了客戶端.
感謝@mdurant 的有用評論,提供引擎幫助:
engine='fastparquet' # or 'pyarrow'
df.to_parquet(filename, compression="gzip", engine=engine)
df = dd.read_parquet(filenames, engine=engine)
顯然 engine='auto' 在安裝了多個 parquet 引擎時在 dask 與 pandas 中選擇了不同的引擎。
旁注:我嘗試了不同的引擎組合,這會觸發問題中的錯誤:
df.to_parquet(filename, compression="gzip", engine='pyarrow')
df = dd.read_parquet(filenames, engine='fastparquet')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.