![](/img/trans.png)
[英]Efficiently read in large csv files using pandas or dask in python
[英]Read Directory of Timeseries CSV data efficiently with Dask DataFrame and Pandas
我有一個時間序列數據目錄存儲為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倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.