使用Dask DataFrame和Pandas有效地读取Timeseries CSV数据的目录

我有一个时间序列数据目录存储为CSV文件,每天一个文件.如何使用Dask DataFrame有效地加载和处理它?

免责声明:我维护Dask.这个问题在其他渠道中经常出现,我决定在StackOverflow上添加一个问题,我可以在将来向人们指出.

最佳答案
简单解决方案

如果你只想快速获得一些东西,那么使用一个globstring为路径简单地使用dask.dataframe.read_csv就足够了:

import dask.dataframe as dd
df = dd.read_csv('2000-*.csv')

关键字参数

dask.dataframe.read_csv函数支持大多数pandas.read_csv关键字参数,因此您可能需要稍微调整一下.

df = dd.read_csv('2000-*.csv', parse_dates=['timestamp'])

设置索引

如果目标列是索引,则许多操作(如groupbys,连接,索引查找等)可能更有效.例如,如果将timestamp列作为索引,那么您可以轻松快速查找特定范围的值,或者您可以随时间有效地与其他数据帧连接.这里的节省可以很容易地达到10倍.

天真的方法是使用set_index方法

df2 = df.set_index('timestamp')

但是,如果您知道新索引列已排序,则可以通过传递sorted = True关键字参数来加快速度

df2 = df.set_index('timestamp', sorted=True)

分部

在上面的例子中,我们仍然通过数据一次找到好的断点.但是,如果您的数据已经很好地分段(例如每天一个文件),那么您可以将这些除法值赋予set_index以避免此初始传递(这对于大量CSV数据来说可能是昂贵的.

import pandas as pd
divisions = tuple(pd.date_range(start='2000', end='2001', freq='1D'))
df2 = df.set_index('timestamp', sorted=True, divisions=divisions)

此解决方案正确且廉价地将时间戳列设置为索引(允许将来进行有效计算).

转换为其他格式

CSV是一种普遍且方便的格式.然而它也很慢.其他格式如Parquet可能会让您感兴趣.它们可以轻松快10倍到100倍.

转载注明原文:使用Dask DataFrame和Pandas有效地读取Timeseries CSV数据的目录 - 代码日志