我想导入多个csv文件到字典中。不幸的是,我的解决方案非常缓慢。我该如何优化代码?
提前感谢!:)
dats = os.listdir(path) #file_names
dat_names = [i.split(sep = "_")[0] for i in dats ] #should be key in dict
PFC_Dict = {}
i = 0
while i < len(dats):
PFC_Dict[dat_names[i]] = pd.read_csv(str(path + str(dats[i])), sep =";", parse_dates= True, index_col=(0), names = ["Preis"], decimal =",", dayfirst =True ).resample("15min").ffill()
i =+ 1
编辑:附加信息:
- 导入文件数:~10个文件
- 文件大小:~ 1mb, CSV格式:(160000,1)
- 背景:
分析的结果应该是以下形式的数据帧:
- 显示文件名的索引
- 列表示不同计算场景(不同参数)
文件由日期时间索引&相应的价格。这些文件有不同的开始日期和不同的价格,因为这些是预测。
我将根据这些数据的开始日期合并不同数据上的这些数据帧。使用每个文件的单独数据框,我可以很容易地找到开始日期,因为它的索引[0]。另一方面,如果我对所有文件使用一个数据帧,我认为查找每个文件的开始日期并不容易。
读取csv是一个缓慢的过程,因为csv是为了供人类阅读的。最有效的文件格式是.feather
。幸运的是,Pandas内置了对羽毛文件的支持:
.read_csv()
—>.read_feather()
.to_csv()
—>.to_feather()
运行一次脚本,将所有.csv
文件转换为.feather
。为此,循环遍历所有csv文件并使用pd.read_csv()
读取它们。接下来使用df.to_feather()
导出。
当你现在运行你的代码时,它应该可以更快地读取.feather
文件。对于我来说,我有一个数据文件,以csv格式读取需要30秒,以羽毛文件格式读取需要1到2秒。
问题不在于代码的速度或数据的大小。只是代码有问题。我循环遍历了导入文件的列表,长度为I
i =+ 1
显然应该是i += 1。否则,它将无限循环遍历列表。
谢谢你的回复!
我个人喜欢pathlib
处理文件路径。你可以这样做:
from pathlib import Path
import pandas as pd
# creates a posix path
folder_path = Path('/your/folder/')
# iterates through the directory and puts everything in a list
file_list = list(folder_path.iterdir())
PFC_Dict = {}
# iterate through the list and add items into the dict
for file in file_list:
PFC_Dict[file.stem.split('_')[0]] = pd.read_csv(file)
这样就不需要运行计数器。也许是你未来任务的解决方案