Python 加载多个拼花文件时保留dask数据帧分割

Python 加载多个拼花文件时保留dask数据帧分割,python,dataframe,dask,fastparquet,Python,Dataframe,Dask,Fastparquet,我有一些以时间为索引的数据帧中的时间序列数据。索引被排序,数据存储在多个拼花地板文件中,每个文件中有一天的数据。我使用dask 2.9.1 当我从一个拼花文件加载数据时,分区设置正确 当我从多个文件加载数据时,我不会在生成的dask数据帧中获得分区 下面的示例说明了该问题: import pandas as pd import pandas.util.testing as tm import dask.dataframe as dd df = tm.makeTimeDataFrame( 48

我有一些以时间为索引的数据帧中的时间序列数据。索引被排序,数据存储在多个拼花地板文件中,每个文件中有一天的数据。我使用dask 2.9.1

当我从一个拼花文件加载数据时,分区设置正确

当我从多个文件加载数据时,我不会在生成的dask数据帧中获得分区

下面的示例说明了该问题:

import pandas as pd 
import pandas.util.testing as tm
import dask.dataframe as dd

df = tm.makeTimeDataFrame( 48, "H")

df1 = df[:24].sort_index()
df2 = df[24:].sort_index()
dd.from_pandas( df1, npartitions=1 ).to_parquet( "df1d.parq", engine="fastparquet" ) 
dd.from_pandas( df2, npartitions=1 ).to_parquet( "df2d.parq", engine="fastparquet" )
ddf = dd.read_parquet( "df*d.parq", infer_divisions=True, sorted_index=True, engine="fastparquet"  ) 
print(ddf.npartitions, ddf.divisions)
这里我得到2个分区和
(无,无,无)
作为分区

我可以让dd.read\u拼花地板将分区设置为实际值吗


更新 在我的实际数据,我有一个拼花地板文件公关日

文件是通过保存数据帧中的数据创建的,其中时间戳用作索引。索引已排序。每个文件的大小为100-150MB,当加载到内存时,它使用2.5GB的RAM,激活索引非常重要,因为重新创建索引非常繁重

我没有设法在read_拼花地板上找到一个参数或引擎的组合,使其在负载时创建分区

数据文件名为“yyyy-mm-dd.parquet”,因此我根据该信息创建分区:

from pathlib import Path
files = list (Path("e:/data").glob("2019-06-*.parquet") )
divisions = [  pd.Timestamp( f.stem) for f in files ] + [ pd.Timestamp( files[-1].stem) + pd.Timedelta(1, unit='D' ) ]
ddf = dd.read_parquet( files )
ddf.divisions = divisions
这并没有启用索引的使用,在某些情况下,由于“TypeError:只能将元组(而不是“列表”)连接到元组”而失败

然后我尝试将分割设置为一个元组
ddf.divisions=tuple(divisions)
然后它就工作了。当索引设置正确时,dask速度非常快


更新2 更好的方法是单独读取dask数据帧,然后将其串联:

from pathlib import Path
import dask.dataframe as dd
files = list (Path("e:/data").glob("2019-06-*.parquet") )
ddfs = [ dd.read_parquet( f ) for f in files ]
ddf = dd.concat(ddfs, axis=0)

通过这种方式设置分区,它还解决了另一个随着时间推移处理列添加的问题

下面我用concat改写了原来的问题,解决了我的问题

import pandas as pd 
import pandas.util.testing as tm
import dask.dataframe as dd

# create two example parquet files
df = tm.makeTimeDataFrame( 48, "H")
df1 = df[:24].sort_index()
df2 = df[24:].sort_index()
dd.from_pandas( df1, npartitions=1 ).to_parquet( "df1d.parq" ) 
dd.from_pandas( df2, npartitions=1 ).to_parquet( "df2d.parq" )

# read the files and concatenate
ddf = dd.concat([dd.read_parquet( d ) for d in ["df1d.parq", "df2d.parq"] ], axis=0)

print(ddf.npartitions, ddf.divisions)

我仍然得到了预期的2个分区,但是现在的分区是
(Timestamp('2000-01-01 00:00:00')、Timestamp('2000-01-02 00:00:00')、Timestamp('2000-01-02 23:00:00'))

下面我已经将原始问题重写为使用concat,解决了我的问题

import pandas as pd 
import pandas.util.testing as tm
import dask.dataframe as dd

# create two example parquet files
df = tm.makeTimeDataFrame( 48, "H")
df1 = df[:24].sort_index()
df2 = df[24:].sort_index()
dd.from_pandas( df1, npartitions=1 ).to_parquet( "df1d.parq" ) 
dd.from_pandas( df2, npartitions=1 ).to_parquet( "df2d.parq" )

# read the files and concatenate
ddf = dd.concat([dd.read_parquet( d ) for d in ["df1d.parq", "df2d.parq"] ], axis=0)

print(ddf.npartitions, ddf.divisions)

我仍然得到了预期的2个分区,但是现在分区是
(Timestamp('2000-01-01 00:00:00')、Timestamp('2000-01-02 00:00:00')、Timestamp('2000-01-02 23:00:00'))

两个单文件案例的分区值是什么:它们重叠吗?分区中应该没有重叠。我用一个有效的解决方案更新了这个问题,但可能有更好的解决方案。两个单文件案例的分区值是什么:它们重叠吗?分区中不应该有重叠。我用一个有效的解决方案更新了这个问题,但可能有更好的解决方案