以每小时csv计算列的平均值

时间:2015-11-18 07:00:26

标签: csv python-3.x numpy pandas average

我有一个csv文件,其中包含以下格式的数据。

Layer   relative_time   Ht    BSs    Vge    Temp    Message
57986   2:52:46       0.00m   87    15.4    None    CMSG 
20729   0:23:02       45.06m  82    11.6    None    BMSG 
20729   0:44:17       45.06m  81    11.6    None    AMSG 

我希望在此csv文件中阅读并计算每小时的平均值BSs。我的csv文件非常庞大,约有2000个值。但是,这些值并非每小时均匀分布。对于例如

我有237 samples from hour 3 and only 4 samples from hour 6。另外我应该提一下,BSs可以从多个来源收集。值始终为20-100。因此,它给出了一个扭曲的结果。对于每小时,我计算该小时的BSs之和除以该小时的样本数。 主要目的是了解BSs随着时间的推移如何演变。

但是这个问题的常见方法是什么。这是人们应用规范化的地方吗?如果有人能解释如何在这种情况下应用规范化,那将是很棒的。

我用于处理的代码如下所示。我相信下面的代码是正确的。

#This 24x2 matrix will contain no of values recorded per hour per hour
hours_no_values = [[0 for i in range(24)] for j in range(2)]

#This 24x2 matrix will contain mean bss stats per hour
mean_bss_stats = [[0 for i in range(24)] for j in range(2)]


with open(PREFINAL_OUTPUT_FILE) as fin, open(FINAL_OUTPUT_FILE, "w",newline='') as f:
    reader = csv.reader(fin, delimiter=",")
    writer = csv.writer(f)
    header = next(reader)  # <--- Pop header out
    writer.writerow([header[0],header[1],header[2],header[3],header[4],header[5],header[6]]) # <--- Write header
    sortedlist = sorted(reader, key=lambda row: datetime.datetime.strptime(row[1],"%H:%M:%S"), reverse=True)
    print(sortedlist)
    for item in sortedlist:
        rel_time = datetime.datetime.strptime(item[1], "%H:%M:%S")
        if rel_time.hour not in hours_no_values[0]:
            print('item[6] {}'.format(item[6]))
            if 'MAN' in item[6]:
                print('Hour found {}'.format(rel_time.hour))
                hours_no_values[0][rel_time.hour] = rel_time.hour
                mean_bss_stats[0][rel_time.hour] = rel_time.hour

                mean_bss_stats[1][rel_time.hour] += int(item[3])

                hours_no_values[1][rel_time.hour] +=1
            else:
                pass
        else:
            if 'MAN' in item[6]:
                print('Hour Previous {}'.format(rel_time.hour))
                mean_bss_stats[1][rel_time.hour] += int(item[3])

                hours_no_values[1][rel_time.hour] +=1
            else:
                pass

    for i in range(0,24):
        if(hours_no_values[1][i] != 0):
            mean_bss_stats[1][i] = mean_bss_stats[1][i]/hours_no_values[1][i]    
        else:
            mean_bss_stats[1][i] = 0


    pprint.pprint('mean bss stats {} \n hour_no_values {} \n'.format(mean_bss_stats,hours_no_values))

0 to 23开始,每小时的价值数量如下:

[31, 117, 85, 237, 3, 67, 11, 4, 57, 0, 5, 21, 2, 5, 10, 8, 29, 7, 14, 3, 1, 1, 0, 0]

1 个答案:

答案 0 :(得分:2)

您可以使用groupby使用pandas并将其聚合到适当的列:

import pandas as pd
import numpy as np
df = pd.read_csv("your_file")
df.groupby('hour')['BSs'].aggregate(np.mean)

如果您在初始数据框中没有该列,则可以添加该列:

df['hour'] = your_hour_data

numpy.mean - 计算数组的平均值。

  

计算沿指定轴的算术平均值。

pandas.groupby

  

使用mapper(dict或key函数,将给定函数应用于组,将结果作为系列返回)或通过一系列列的组系列

来自pandas docs

  

“group by”我们指的是涉及以下一个或多个步骤的流程

     

根据某些标准将数据拆分成组   将功能独立应用于每个组
  将结果组合成数据结构

     

聚合:计算每个组的摘要统计信息(或统计信息)   一些例子:

     

计算组总和或表示
  计算组大小/计数

相关问题