导入多个 CSV 文件,select 每个文件的 1 列并使用 Jupyter Noteboos 中的文件名重命名该列
Import multiple CSV files, select 1 Column from each file & rename the column with the file name in Jupyter Noteboos
我正在尝试从这个 kaggle 导入 100 个 CSV 文件 link - https://www.kaggle.com/natehenderson/nate-s-cryptocurrency-analysis/data
每个文件包含不同加密货币的历史信息。
每个文件如下所示:
How data looks like
对于当前的分析,我只需要每个文件的市值列以及作为时间戳的索引。
因此对于每个文件,唯一需要的列是市值。
然后我需要附加每一列并将列名替换为文件名。
最终结果应该是这样的:
Final Result
其中每列包含粗略的市值,每个值应与索引相对应,列名应与 csv 文件的名称相同。
有什么办法可以做到这一点吗?
以下应该可以帮助您入门。这假设您有一个包含所有 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)
我正在尝试从这个 kaggle 导入 100 个 CSV 文件 link - https://www.kaggle.com/natehenderson/nate-s-cryptocurrency-analysis/data
每个文件包含不同加密货币的历史信息。
每个文件如下所示:
How data looks like
对于当前的分析,我只需要每个文件的市值列以及作为时间戳的索引。
因此对于每个文件,唯一需要的列是市值。 然后我需要附加每一列并将列名替换为文件名。
最终结果应该是这样的:
Final Result
其中每列包含粗略的市值,每个值应与索引相对应,列名应与 csv 文件的名称相同。
有什么办法可以做到这一点吗?
以下应该可以帮助您入门。这假设您有一个包含所有 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)