导入多个CSV文件,从每个文件中选择一列并用Jupyter Noteboos中的文件名重命名该列

2024-04-16 22:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从这个kaggle链接导入100个CSV文件-https://www.kaggle.com/natehenderson/nate-s-cryptocurrency-analysis/data

每个文件都包含不同加密货币的历史信息。你知道吗

每个文件如下所示:

How data looks like

对于当前的分析,我只需要每个文件的市值列以及作为时间戳的索引。你知道吗

因此,对于每个文件,唯一需要的列是市值。 然后我需要追加每一列&用文件名替换列名。你知道吗

最终结果如下:

Final Result

如果每一列都包含粗略的市值,那么每一个值都应该与索引相对应,并且列的名称应该与csv文件的名称相同。你知道吗

有什么办法吗?你知道吗


Tags: 文件csvhttps名称comdata链接www
1条回答
网友
1楼 · 发布于 2024-04-16 22:11:43

下面应该让你开始。这假设您有一个包含所有CSV文件的文件夹,并且每个CSV文件具有相同的格式,例如:

Date,Open,High,Low,Close,Volume,Market Cap
"Sep 22, 2017",1.23,1.25,1.14,1.24,513898,12916700
"Sep 23, 2017",1.28,1.35,1.18,1.23,1700200,13448400

当您试图水平写入数据时,需要将所有数据收集到内存中,然后才能写入。这个脚本一次读取一个文件,并将每一行分配给一个字典字典。第一个包含date,第二个包含有该日期条目的所有货币。将date转换为datetime对象,以确保在写入输出CSV文件时可以正确排序。在读取每个文件时,其名称存储在一个集合中,这样就可以获得货币名称的最终列表。你知道吗

要输出,将对货币名称进行排序,并使用DictWriter保存所有值。这样做的好处是为丢失的数据存储空值:

from collections import defaultdict
from operator import itemgetter
from datetime import datetime
import csv
import glob
import os

req_cols = itemgetter(0, 6)
all_data = defaultdict(dict)
currencies = set()
date_format1 = '%b %d, %Y'  # e.g. "Sep 22, 2017"
date_format2 = '%B %d, %Y'  # e.g. "June 22, 2017"

for csv_filename in glob.glob('*.csv'):
    with open(csv_filename, newline='') as f_input:
        currency_name = os.path.splitext(os.path.basename(csv_filename))[0]
        csv_input = csv.reader(f_input)
        header = next(csv_input)
        currencies.add(currency_name)

        for row in csv_input:
            date, market_cap = req_cols(row)

            try:
                date = datetime.strptime(date, date_format1)
            except ValueError:      # Try "June 22, 2017"
                date = datetime.strptime(date, date_format2)

            all_data[date][currency_name] = market_cap

currencies = sorted(currencies)

with open('output.csv', 'w', newline='') as f_output:
    header = ['Date'] + currencies
    csv_output = csv.DictWriter(f_output, fieldnames=header)
    csv_output.writeheader()

    for date, entries in sorted(all_data.items()):
        entries['Date'] = date.strftime(date_format1)
        csv_output.writerow(entries)

相关问题 更多 >