【问题标题】:Math operation on very large CSV (roughly 25-30K lines) in Python3Python3中非常大的CSV(大约25-30K行)的数学运算
【发布时间】:2011-09-14 12:55:30
【问题描述】:

我在之前的问题中得到了一些帮助,但这是一个完全不同的问题,所以我认为最好是一个新问题......

每月一次我需要解析一个非常大的 CSV 文件,我通常会在 Excel 中手动完成,但我现在想在 Python 中自动完成。

CSV 的结构如下:

[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 中,我会使用自动过滤器并选择该列中的每个列表,然后选择 [date3 - date2] 列并获得平均值,但这有点乏味且耗时。

谢谢!

【问题讨论】:

  • 你有什么问题? csv 模块对此很有用。但我看到你已经从your earlier question 知道了。
  • 对不起。我不确定如何告诉它“对所有 original_file1 执行此操作,然后对所有 original_file2 执行相同操作,因为它们没有设置我可以手动编码的变量。每个月它可能是不同的值。
  • 前面的问题也解释了glob模块是干什么用的……
  • 我的印象是 glob 用于路径名匹配,而不是匹配单个文件中的模式。所有这些值都在一个文件中(作为第一个问题中所有其他文件的输出)。现在我需要浏览该单个文件并执行上面列出的其他操作。如果最好重新编写程序以输出到多个文件,我可以这样做,但我认为最好使用一个文件。我不知道如何在这种情况下使用 glob(所有数据现在都在一个文件中)。我正在尝试学习如何使用 Python,但显然对它不是很有经验。
  • 哦,是的,对不起,我之前确实看过数据,但我忘了里面有文件名。

标签: csv python-3.x average


【解决方案1】:

如果我理解正确,您可以按以下方式进行操作(希望代码是自我解释的):

您可以在 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) 

希望对你有帮助。

【讨论】:

  • 请注意,此代码假定文件名已排序,但可能并非如此。
  • 你的意思是我的伪代码,它自然会比你这样的完整解决方案更简洁:)
  • 感谢您的贡献!
【解决方案2】:

好的,我假设您已经打开了文件并且可以读取和解析带有csv 的行。我建议制作一个字典,键是文件名,值是元组:(计数,日期差异的总和)。像这样的:

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]

【讨论】:

  • 感谢您的解决方案,我将处理此问题并报告进展情况!
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多