我有一個檔案夾/data/csvs,其中包含 ~7000 個 CSV 檔案,每個檔案有 ~600 行。每個 CSV 都有一個名稱,其中包含需要保留的時間戳,例如/data/csvs/261121.csv,/data/csvs/261122.csv(261121今天的日期 26/11/21)。
我需要:
- 加載每個 CSV。
- 添加一個可以保存時間戳的列,以便我知道資料來自哪個檔案。時間每行增加半秒,因此該行還顯示小時/分鐘/秒/微秒。
- 將行合并到一個表中,該表將涵蓋一個月的資料。
- 理想情況下,我希望最終產品是 DataFrame。
目前這就是我正在做的事情:
files = os.listdir('/data/csvs')
csv_names = []
for file_name in files:
if file_name[-4:] == '.csv':
csv_names.append(file_name)
to_process = len(csv_names)
for i, csv_name in enumerate(csv_names):
df = pd.read_csv(f'{csv_folder_path}/{file_name}')
df = timestamp(df, csv_name)
to_process = to_process-1
if i == 0:
concat_df = df
concat_df.to_feather(path=processed_path)
else:
concat_df = pd.concat([concat_df, df])
if to_process % 100 == 0:
saved_df = pd.read_feather(path=processed_path)
concat_df = pd.concat([saved_df, concat_df])
concat_df.reset_index(drop=True, inplace=True)
concat_df.to_feather(path=processed_path)
我將每個 CSV 作為 DataFrame 加載,添加時間戳列并一次連接 100 個 CSV(因為我認為這會減少記憶體使用量),然后一次將 100 個 CSV 保存到一個大型 DataFrame 羽毛檔案中。這真的很慢并且使用了大量記憶體。
這樣做的更有效方法是什么?
uj5u.com熱心網友回復:
首先,您可以更有效地使用glob. 這可以節省您遍歷所有檔案并檢查檔案擴展名是否為“.csv”
import glob
src = '/data/csvs'
files = glob.iglob(os.path.join(src, "*.csv"))
然后,將所有檔案讀入 df 并將它們添加到生成器中,在同一步驟中將檔案的基本名稱分配給名為時間戳的列
df_from_each_file = (pd.read_csv(f).assign(timestamp=os.path.basename(f).split('.')[0]) for f in files)
最后將 dfs 連接成一個
csv_data = pd.concat(df_from_each_file, ignore_index=True)
希望這有幫助!我已經對大量資料使用了這樣的程序,并發現它足夠有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366858.html
上一篇:IllegalStateException:SpringDataREST控制器......不得在類級別使用@RequestMapping,因為這會導致雙重注冊
下一篇:python中的累積平均值
