如果CSV文件还有一个日期列,我该如何计算CSV中列的月平均值

时间:2017-07-28 22:36:53

标签: python csv

这就是CSV / Excel文件的样子:

`2008-09-19 461 462.07  443.28  449.15  10006000    449.15
2008-09-18  422.64  439.18  410.5   439.08  8589400 439.08
2008-09-17  438.48  439.14  413.44  414.49  9126900 414.49
2008-09-16  425.96  449.28  425.49  442.93  6990700 442.93
2008-09-15  424 441.97  423.71  433.86  6567400 433.86
2008-09-12  430.21  441.99  429 437.66  6028000 437.66
2008-09-11  408.35  435.09  406.38  433.75  6471400 433.75
2008-09-10  424.47  424.48  409.68  414.16  6226800 414.16
2008-09-09  423.17  432.38  415 418.66  7229600 418.66
2008-09-08  452.02  452.94  417.55  419.95  9017900 419.95
2008-09-05  445.49  452.46  440.08  444.25  4534300 444.25
2008-09-04  460 463.24  449.4   450.26  4848500 450.26
2008-09-03  468.73  474.29  459.58  464.41  4314600 464.41
2008-09-02  476.77  482.18  461.42  465.25  6111500 465.25
2008-08-29  469.75  471.01  462.33  463.29  3848200 463.29
2008-08-28  472.49  476.45  470.33  473.78  3029700 473.78
`

我需要计算最终列的月平均值并将其存储在列表中。

到目前为止我所拥有的是非常可怕的,因为我一直在拼凑垃圾代码几天,现在正努力做到正确而且我知道事实上有更多有效(和功能)的方法来做到这一点。对于任何有兴趣的人来说,这是我目前功能失调的代码:

def get_monthly_averages (data_list):
    date_list = []
    monthly_average_list = []
    current_date = ''
    nums = []
    count = 0
    total = 0
    average = 0
    for index, row in enumerate(data_list):
        data_list[index] = row.split(",")
    for index, row in enumerate(data_list):
        if index > 0:
            date_list.append(row[0])
            data_list[index] = [float(i) for i in row if row.index(i) > 0]
    for index, row in enumerate(data_list):
        if index == 1:
            current_date = str(date_list[index-1])
            current_date = current_date[:-3]
            count += 1
            nums = row[5:6]

        elif index > 1 and current_date in date_list[index - 1]:
            nums = row[5:6]




            monthly_average_list.append(average)

        elif index > 1 and current_date not in date_list[index - 1]:
            current_date = str(date_list[index-1])
            current_date = current_date[:-3]
            nums = row[5:6]
            total = 0




    print(monthly_average_list[0])
    print(current_date)
    print(date_list[0])
    print(data_list[1])    

    return monthly_average_list

1 个答案:

答案 0 :(得分:0)

如果我正确理解你要去的结果,是的,我认为你已经推翻了解决方案。如果您想要列的按月平均值,您需要做的就是找到该列中的所有单元格,按月对它们进行分组并对它们取平均值:

from collections import defaultdict

def get_col_avg_by_month(data, colnumber):
    result = defaultdict(lambda: [])
    for row in (row.split() for row in data):
        date = year, month = row[0].split('-')[:2]
        result[tuple(date)].append(float(row[colnumber]))
    return {date: avg(data) for date, data in result.items()}

在这里,我们抓住每一行(我们与2017年9月和2016年9月之间的年份配对)并将目标列的单元格附加到该月的结果列表(我们使用一个defaultdict,以便我们第一次投入新月,我们从一个空列表开始)。最后,在我们返回之前,我们重新计算结果dict以保存数据集的平均值,而不是数据集本身(avg = lambda lst: sum(lst) / len(lst))。

demo