【问题标题】:How to merge many CSV files?如何合并多个 CSV 文件?
【发布时间】:2021-05-17 15:03:29
【问题描述】:

我有大约 7500 个 csv 需要合并为一个,以便创建一个易于阅读的表格。 文件格式如下:

  1. 每个文件都以股票代码的形式命名(例如:AA.csv、AAL.csv、AAPL.csv 等...)

  2. 每个文件本身都包含这种格式的日期和数字

    2018-10-11,1
    2018-10-12,3
    2018-10-15,2
    ...
    

现在我想将它们合并到一个单独的 csv 文件中,其中生成的表格在标题中包含代码的名称,在第一列中包含日期并跟随数字(显然保持 csv 格式)。

例子:

请注意,有些 csv 文件是空的,有些有不同的开始日期或日期刚刚停止

【问题讨论】:

标签: python excel csv


【解决方案1】:

由于您有不统一的 csv,以及一些特定要求:

  • 输出 csv 的特定格式
  • 一些 csv 文件是空的
  • 一些 csv 文件有不同的开始日期
  • 一些 csv 文件有中断日期

我会用 csv 模块做这样的事情:

import os,csv
csv_dir = "C:\\Users\Diego\\PycharmProjects\\thesis\\Tickers List\\"
csv_out = 'csvout.csv'

all_dates = []
fin_table = dict()

# iterating over all csv files
for csv_file in os.listdir(csv_dir):
    if True:

        csv_name = csv_file #[:-4] # excluding the ".csv" extension 
        table = dict()
        
        print(csv_dir+csv_file)
        with open(csv_dir+csv_file, 'r') as r:
            csvReader = csv.reader(r)

            for i, row in enumerate(csvReader):
                all_dates.append(row[0])
                table[row[0]] = row[1]
        fin_table[csv_name] = table
    

# populating the final csv 
with open(csv_out, 'w+') as w:
    csvWriter = csv.writer(w)

    # adding the header
    input_row = ['Dates']
    for stock, table in iter(sorted(fin_table.items())):
        input_row.append(stock)
    csvWriter.writerow(input_row)

    # Adding the rest of the table by available date 
    # since, some dates may not have a value, as you said   
    for date in sorted(all_dates): 
        
        # adding the date rows and stock values 1 by 1
        input_row = [date]
        for stock, table in iter(sorted(fin_table.items())):
            # NOVALUE will be put in cells  
            # where a value doesn't exist for a date
            input_row.append(table.get(date, 'NOVALUE')) 
        csvWriter.writerow(input_row)

# ************************** end of program code

【讨论】:

  • 我收到此错误:回溯(最近一次调用最后一次):文件“C:\Users\Diego\PycharmProjects\thesis\MERGE.py”,第 16 行,在 中打开(csv_file , 'r') as r: FileNotFoundError: [Errno 2] No such file or directory: 'A.csv' 也许是因为文件只命名为 A、AA,没有 .csv(但它们是 csv)我该如何解决?
  • 请将csv_dir变量值替换为所有csvs所在的文件夹!好的,我会编辑代码。试试新版本!
  • 同样的错误“没有这样的文件或目录:'A.csv'”我编辑了 csv 目录路径如下:csv_dir=r'C:\Users\Diego\PycharmProjects\thesis\Tickers List'我复制并粘贴了 csv 文件所在的路径
  • 我知道发生了什么......我编辑了代码! with open(csv_dir+csv_file, 'r') as r: 行中的路径必须正确。我添加了一个打印来检测它!检查最新代码!
  • 不,那更糟。现在错误是: Traceback(最近一次调用最后一次):文件“C:\Users\Diego\PycharmProjects\thesis\MERGE.py”,第 17 行,在 中,open(csv_dir + csv_file, 'r') as r: FileNotFoundError: [Errno 2] 没有这样的文件或目录:'C:\\Users\\Diego\\PycharmProjects\\thesis\\Tickers ListA.csv'
【解决方案2】:

你可以这样做:

import pandas as pd
import numpy as np
from glob import glob

dfs_list = []
for csv_file in glob('Tickers List/*.csv'):
    stock_ticker = csv_file.split(".")[0]
    df = pd.read_csv(csv_file,header=None, names=["date","num"])
    if df.shape[0] >0:
        df["date"] = pd.to_datetime(df["date"],format="%Y-%m-%d")
        df["stock_ticker"] = stock_ticker
        dfs_list.append(df)

final_df = pd.concat(dfs_list)

使用glob('dir/*.csv'),我们可以将所有 csv 文件放在一个文件夹中。

在此之后,您将拥有一个如下所示的 DataFrame:

如果你想改变你的格式,你可以这样做: (请注意,日期会自动排序,因为用作索引)。

final_df = pd.pivot_table(final_df, values='num', index=['date'],
               columns=['stock_ticker'], fill_value=np.nan)

您将拥有一个如下所示的 DataFrame:

现在您可以使用以下方法将此 DataFrame 写入新的 csv:

final_df.to_csv("merged.csv")

完整代码

import pandas as pd
import numpy as np
from glob import glob

dfs_list = []
for csv_file in glob('Tickers List/*.csv'):
    stock_ticker = csv_file.split(".")[0]
    df = pd.read_csv(csv_file,header=None, names=["date","num"])
    if df.shape[0] >0:
        df["date"] = pd.to_datetime(df["date"],format="%Y-%m-%d")
        df["stock_ticker"] = stock_ticker
        dfs_list.append(df)

final_df = pd.concat(dfs_list)

final_df = pd.pivot_table(final_df, values='num', index=['date'],
               columns=['stock_ticker'], fill_value=np.nan)

final_df.to_csv("merged.csv")

【讨论】:

  • ["AA.csv","AAL.csv"..] 但是我需要选择一个文件夹中的所有文件,我不能把它们写下来,因为它们很多跨度>
  • 它们都在同一个文件夹中吗?
  • 我需要在第一部分替换一些东西吗?喜欢目录路径?
  • 你需要改变glob里面的csvs dir路径。
  • 对不起,我是个真正的菜鸟。我不明白如何在正确的位置输入所有 \\ 和 : 的正确路径。有没有快速的方法?
猜你喜欢
  • 2023-02-14
  • 2014-05-17
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2014-01-07
相关资源
最近更新 更多