Python3中非常大的CSV(大约25-30K行)上的数学运算
我在之前的一个问题中得到了一些帮助,但是这是一个完全不同的问题,所以我认为一个新的问题将是最好的 每个月我需要解析一个非常大的CSV文件,通常我会在Excel中手动解析,但现在我想在Python中自动解析 CSV的结构如下:Python3中非常大的CSV(大约25-30K行)上的数学运算,csv,python-3.x,average,Csv,Python 3.x,Average,我在之前的一个问题中得到了一些帮助,但是这是一个完全不同的问题,所以我认为一个新的问题将是最好的 每个月我需要解析一个非常大的CSV文件,通常我会在Excel中手动解析,但现在我想在Python中自动解析 CSV的结构如下: [IDNUMBER],[DATE1],[DATE2],[DATE3],[STRING-OF-WHAT-HAPPENED],[DATE3 - DATE2 IN DAYS],[ORIGINAL-FILENAME] 我需要的基本上是打印出以下内容或文件,但我不需要保留这些数据,
[IDNUMBER],[DATE1],[DATE2],[DATE3],[STRING-OF-WHAT-HAPPENED],[DATE3 - DATE2 IN DAYS],[ORIGINAL-FILENAME]
我需要的基本上是打印出以下内容或文件,但我不需要保留这些数据,我只需将其插入一些图表:
对于每个可以多达1200行的原始文件名,我需要平均[DATE3-DATE2 IN DAYS]。例如:
12345,2011-06-12,2011-07-01,2011-07-2,1,['1100.csv']
54321,2011-06-12,2011-07-01,2011-07-3,2,['1100.csv']
23452,2011-06-12,2011-07-01,2011-07-4,3,['1100.csv']
平均值是2,我需要知道这个数字,知道每个文件有多少个也会很有帮助,在这个例子中是3
然后移动到下一个原始文件名,即行中的最后一项,直到CSV结束
在excel中,我会使用autofilter并选择该列中的每个列表,然后只选择[date3-date2]列并获得一个平均值,但这有点繁琐和耗时
谢谢 如果我理解正确,您可以按如下方式操作,希望代码是不言自明的: 您可以使用Python中的“csv”模块来读取文件
import csv
fileHandler = open('yourFile', 'rU')
csvReader = csv.reader(fileHandler)
#Get the first row to initialize variables
firstRow = csvReader.next()
columnToAverage = 5
originalFileColumn = 6
runningDaysSum = atoi(firstRow[columnToAverage])
totalRows = 1
originalFileName = firstRow[originalFileColumn]
result = {}
for row in csvReader:
#Move to next row
if originalFileName != row[originalFileColumn]:
average = runningDaysSum/totalRows
result[originalFileName] = (average, totalRows)
originalFileName = row[originalFileColumn]
totalRows = 0
runningDaysSum = 0
runningDaysSum += atoi(row[columnToAverage])
totalRows += 1
#For last row
result[originalFileName] = (average, totalRows)
希望有帮助。好的,我假设您已经打开了文件,可以使用csv读取和解析行。我建议制作一个字典,键是文件名,值是元组:count,datediff之和。大概是这样的:
data = {}
while [read and parse line]:
datediff = [DATE3 - DATE2]
if filename not in data:
data[filename] = (1, datediff)
else:
ct, sum = data[filename]
data[filename] = (ct + 1, sum + datediff)
for fname in sorted(data.keys):
ct, sum = data[filename]
avg = sum / ct
[print]
你的问题是什么?csv模块对此很有用。但我看你已经知道了,对不起。我不知道如何告诉它对所有的原始文件1这样做,然后对所有的原始文件2做同样的事情,因为它们不是我可以手动编码的设置变量。每个月都可能有不同的值。前面的问题还解释了glob模块的用途…我的印象是glob用于路径名匹配,而不是匹配单个文件中的模式。所有这些值都在一个文件中,作为第一个问题中所有其他文件的输出。现在我需要遍历这个文件并执行上面列出的其他操作。如果重新编写程序以输出多个文件更好,我可以这样做,但我认为最好使用一个文件。我不知道如何在这个上下文中使用glob,因为现在所有的数据都在一个文件中。我正在尝试学习如何使用Python,显然我对它不是很有经验。哦,是的,对不起,我以前看过数据,但我忘了其中有文件名。请注意,这段代码假设文件名已排序,但可能不是这样。你是指我的伪代码,这当然比像你这样的完整解决方案更简洁:谢谢你的贡献!感谢您的解决方案,我将对此进行研究,并汇报进展情况!