我正在尝试拆分包含1500多家公司库存数据的CSV文件。第一列包含日期,后续列包含公司数据。
目标1:我试图将巨大的CSV文件分成更小的部分。让我们说每个较小的文件有30家公司。为此,我需要按列号拆分CSV,而不是行。我一直在寻找代码片段,但我还没有找到任何完全符合这一要求的内容。此外,每个单独的文件都需要包含第一列,即日期。
目标2:我想让公司名称成为自己的列,日期是自己的列和自己的指标列。因此,我可以将公司的数据称为Django中的单个记录(行) - 我不需要所有日期,只需每个季度的最后一天。现在,我必须按日期和指示器过滤数据,并将其设置为在我的前端显示的对象。
如果您有疑问,请询问。
修改
以下是我修补的一些代码。
import os
import csv
from math import floor
from datetime import datetime
import re
class SimFinDataset:
def __init__(self, dataFilePath, csvDelimiter = "semicolon"):
self.numIndicators = None
self.numCompanies = 1
# load data
self.loadData(dataFilePath, csvDelimiter)
def loadData(self, filePath, delimiter):
numRow = 0
delimiterChar = ";" if delimiter == "semicolon" else ","
csvfile = open(filePath, 'rb')
reader = csv.reader(csvfile, delimiter=delimiterChar, quotechar='"')
header = next(reader)
row_count = sum(1 for _ in reader)
csvfile.seek(0)
for row in reader:
numRow += 1
if numRow > 1 and numRow != row_count and numRow != row_count-1:
# company id row
if numRow == 2:
rowLen = len(row)
idVal = None
for index, columnVal in enumerate(row):
if index > 0:
if idVal is not None and idVal != columnVal:
self.numCompanies += 1
if self.numIndicators is None:
self.numIndicators = index - 1
if index + 1 == rowLen:
if self.numIndicators is None:
self.numIndicators = index
idVal = columnVal
if numRow > 2 and self.numIndicators is None:
return
else:
filename = 1
with open(str(filename) + '.csv', 'wb') as csvfile:
if self.numCompanies % 30 == 0:
print ("im working")
spamwriter = csv.writer(csvfile, delimiter=';')
spamwriter.writerow(header)
spamwriter.writerow(row)
filename += 1
#print (self.numIndicators)
dataset = SimFinDataset('new-data.csv','semicolon')
答案 0 :(得分:0)
目标1的解决方案就在这里。 splitting CSV file by columns
但是你有熊猫的方式:
import pandas as pd
# let's say first 10 columns
csv_path="mycsv.csv"
out_path ="\\...\\out.csv"
pd.read_csv(csv_path).iloc[:, :10].to_csv(out_path)
您也可以执行类似
的操作mydf.groupby("company_name").unstack()`
使每个公司成为自己的专栏